chief-clancy 0.6.0 → 0.7.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 +3 -2
- package/dist/bundle/clancy-afk.js +6 -2
- package/dist/bundle/clancy-once.js +40 -39
- package/dist/installer/hook-installer/hook-installer.d.ts +2 -0
- package/dist/installer/hook-installer/hook-installer.d.ts.map +1 -1
- package/dist/installer/hook-installer/hook-installer.js +36 -1
- package/dist/installer/hook-installer/hook-installer.js.map +1 -1
- package/dist/installer/install.js +8 -0
- package/dist/installer/install.js.map +1 -1
- package/dist/schemas/env.d.ts +20 -0
- package/dist/schemas/env.d.ts.map +1 -1
- package/dist/schemas/env.js +6 -0
- package/dist/schemas/env.js.map +1 -1
- package/dist/scripts/afk/afk.d.ts.map +1 -1
- package/dist/scripts/afk/afk.js +27 -0
- package/dist/scripts/afk/afk.js.map +1 -1
- package/dist/scripts/afk/report/report.d.ts +47 -0
- package/dist/scripts/afk/report/report.d.ts.map +1 -0
- package/dist/scripts/afk/report/report.js +194 -0
- package/dist/scripts/afk/report/report.js.map +1 -0
- package/dist/scripts/once/cost/cost.d.ts +10 -0
- package/dist/scripts/once/cost/cost.d.ts.map +1 -0
- package/dist/scripts/once/cost/cost.js +23 -0
- package/dist/scripts/once/cost/cost.js.map +1 -0
- package/dist/scripts/once/deliver/deliver.d.ts.map +1 -1
- package/dist/scripts/once/deliver/deliver.js +18 -1
- package/dist/scripts/once/deliver/deliver.js.map +1 -1
- package/dist/scripts/once/lock/lock.d.ts +17 -0
- package/dist/scripts/once/lock/lock.d.ts.map +1 -0
- package/dist/scripts/once/lock/lock.js +70 -0
- package/dist/scripts/once/lock/lock.js.map +1 -0
- package/dist/scripts/once/once.d.ts.map +1 -1
- package/dist/scripts/once/once.js +100 -4
- package/dist/scripts/once/once.js.map +1 -1
- package/dist/scripts/once/resume/resume.d.ts +24 -0
- package/dist/scripts/once/resume/resume.d.ts.map +1 -0
- package/dist/scripts/once/resume/resume.js +159 -0
- package/dist/scripts/once/resume/resume.js.map +1 -0
- package/dist/scripts/shared/format/format.d.ts.map +1 -1
- package/dist/scripts/shared/format/format.js +6 -1
- package/dist/scripts/shared/format/format.js.map +1 -1
- package/dist/scripts/shared/progress/progress.d.ts +13 -0
- package/dist/scripts/shared/progress/progress.d.ts.map +1 -1
- package/dist/scripts/shared/progress/progress.js +1 -1
- package/dist/scripts/shared/progress/progress.js.map +1 -1
- package/dist/scripts/shared/pull-request/pr-body/pr-body.d.ts +2 -1
- package/dist/scripts/shared/pull-request/pr-body/pr-body.d.ts.map +1 -1
- package/dist/scripts/shared/pull-request/pr-body/pr-body.js +10 -1
- package/dist/scripts/shared/pull-request/pr-body/pr-body.js.map +1 -1
- package/dist/types/remote.d.ts +1 -1
- package/dist/types/remote.d.ts.map +1 -1
- package/hooks/clancy-branch-guard.js +129 -0
- package/hooks/clancy-context-monitor.js +134 -46
- package/hooks/clancy-post-compact.js +53 -0
- package/hooks/package.json +3 -0
- package/package.json +3 -2
- package/src/agents/verification-gate.md +128 -0
- package/src/roles/setup/workflows/init.md +45 -0
- package/src/roles/setup/workflows/scaffold.md +30 -0
- package/src/roles/setup/workflows/settings.md +56 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume.js","sourceRoot":"","sources":["../../../../src/scripts/once/resume/resume.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,OAAO,EACL,YAAY,EACZ,QAAQ,EACR,qBAAqB,EACrB,UAAU,GACX,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,kDAAkD,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAEtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAUlE,gFAAgF;AAEhF;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,IAAc;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC;IAEjC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,iEAAiE;IACjE,IAAI,cAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,cAAc,GAAG,YAAY,CAC3B,KAAK,EACL,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,CAAC,EACrC;YACE,QAAQ,EAAE,MAAM;SACjB,CACF,CAAC,IAAI,EAAE,CAAC;IACX,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC;QACH,QAAQ,CAAC,MAAM,CAAC,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,IAAI,CAAC;QACH,WAAW,GAAG,qBAAqB,EAAE,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,2CAA2C;IAC7C,CAAC;IAED,IAAI,CAAC;QACH,+DAA+D;QAC/D,MAAM,GAAG,GAAG,YAAY,CACtB,KAAK,EACL,CAAC,KAAK,EAAE,UAAU,MAAM,KAAK,MAAM,EAAE,EAAE,WAAW,CAAC,EACnD,EAAE,QAAQ,EAAE,MAAM,EAAE,CACrB,CAAC,IAAI,EAAE,CAAC;QACT,QAAQ,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,+EAA+E;QAC/E,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CACtB,KAAK,EACL,CAAC,KAAK,EAAE,UAAU,IAAI,CAAC,YAAY,KAAK,MAAM,EAAE,EAAE,WAAW,CAAC,EAC9D,EAAE,QAAQ,EAAE,MAAM,EAAE,CACrB,CAAC,IAAI,EAAE,CAAC;YACT,QAAQ,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,wCAAwC;QAC1C,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,IAAI,CAAC;QACH,QAAQ,CAAC,cAAc,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,cAAc;IAChB,CAAC;IAED,IAAI,CAAC,WAAW,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;AACxE,CAAC;AAED,gFAAgF;AAEhF;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAmB,EACnB,IAAc,EACd,UAAsB;IAEtB,IAAI,CAAC;QACH,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAE5B,6BAA6B;QAC7B,wEAAwE;QACxE,yEAAyE;QACzE,0DAA0D;QAC1D,IAAI,UAAU,CAAC,cAAc,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACH,YAAY,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;gBACzD,YAAY,CACV,KAAK,EACL,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,IAAI,CAAC,SAAS,uBAAuB,CAAC,EAC9D,EAAE,QAAQ,EAAE,MAAM,EAAE,CACrB,CAAC;gBACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,sCAAsC,IAAI,CAAC,SAAS,EAAE,CAAC,CAC9D,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,GAAG,CACT,MAAM,CAAC,mCAAmC,UAAU,CAAC,MAAM,EAAE,CAAC,CAC/D,CAAC;gBACF,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,OAAO;QACP,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,sBAAsB,UAAU,CAAC,MAAM,YAAY,CAAC,CAAC,CAAC;YACzE,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAEtD,sBAAsB;QACtB,MAAM,gBAAgB,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC;QAC/D,MAAM,MAAM,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,QAAQ,IAAI,CAAC,SAAS,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAC/D,MAAM,MAAM,GAAG,WAAW,CACxB,MAAM,EACN;YACE,GAAG,EAAE,IAAI,CAAC,SAAS;YACnB,KAAK,EAAE,IAAI,CAAC,WAAW;YACvB,WAAW,EAAE,EAAE;YACf,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B,EACD,IAAI,CAAC,YAAY,CAClB,CAAC;QAEF,IACE,MAAM,CAAC,IAAI,KAAK,MAAM;YACtB,MAAM,CAAC,IAAI,KAAK,SAAS;YACzB,MAAM,CAAC,IAAI,KAAK,OAAO,EACvB,CAAC;YACD,MAAM,EAAE,GAAG,MAAM,iBAAiB,CAChC,MAAM,EACN,MAAM,EACN,UAAU,CAAC,MAAM,EACjB,IAAI,CAAC,YAAY,EACjB,OAAO,EACP,MAAM,CACP,CAAC;YAEF,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC;gBACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBAChD,cAAc,CACZ,OAAO,CAAC,GAAG,EAAE,EACb,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,WAAW,EAChB,SAAS,EACT,EAAE,CAAC,MAAM,EACT,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,KAAK,MAAM;oBACzC,CAAC,CAAC,IAAI,CAAC,SAAS;oBAChB,CAAC,CAAC,SAAS,CACd,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC,CAAC;gBAC5D,cAAc,CACZ,OAAO,CAAC,GAAG,EAAE,EACb,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,WAAW,EAChB,SAAS,EACT,SAAS,EACT,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,KAAK,MAAM;oBACzC,CAAC,CAAC,IAAI,CAAC,SAAS;oBAChB,CAAC,CAAC,SAAS,CACd,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,cAAc,CACZ,OAAO,CAAC,GAAG,EAAE,EACb,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,WAAW,EAChB,SAAS,EACT,SAAS,EACT,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,KAAK,MAAM;gBACzC,CAAC,CAAC,IAAI,CAAC,SAAS;gBAChB,CAAC,CAAC,SAAS,CACd,CAAC;QACJ,CAAC;QAED,+BAA+B;QAC/B,IAAI,CAAC;YACH,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CACT,MAAM,CACJ,sBAAsB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACzE,CACF,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../../src/scripts/shared/format/format.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../../src/scripts/shared/format/format.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAejD"}
|
|
@@ -13,6 +13,11 @@ export function formatDuration(ms) {
|
|
|
13
13
|
return `${secs}s`;
|
|
14
14
|
const mins = Math.floor(secs / 60);
|
|
15
15
|
const remSecs = secs % 60;
|
|
16
|
-
|
|
16
|
+
if (mins < 60) {
|
|
17
|
+
return remSecs > 0 ? `${mins}m ${remSecs}s` : `${mins}m`;
|
|
18
|
+
}
|
|
19
|
+
const hours = Math.floor(mins / 60);
|
|
20
|
+
const remMins = mins % 60;
|
|
21
|
+
return remMins > 0 ? `${hours}h ${remMins}m` : `${hours}h`;
|
|
17
22
|
}
|
|
18
23
|
//# sourceMappingURL=format.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../../src/scripts/shared/format/format.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,EAAU;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACnC,IAAI,IAAI,GAAG,EAAE;QAAE,OAAO,GAAG,IAAI,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../../src/scripts/shared/format/format.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,EAAU;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACnC,IAAI,IAAI,GAAG,EAAE;QAAE,OAAO,GAAG,IAAI,GAAG,CAAC;IAEjC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;IAE1B,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC;QACd,OAAO,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC;IAC3D,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;IAE1B,OAAO,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC;AAC7D,CAAC"}
|
|
@@ -38,6 +38,19 @@ export declare function formatTimestamp(date: Date): string;
|
|
|
38
38
|
* ```
|
|
39
39
|
*/
|
|
40
40
|
export declare function appendProgress(projectRoot: string, key: string, summary: string, status: ProgressStatus, prNumber?: number, parent?: string): void;
|
|
41
|
+
/**
|
|
42
|
+
* Parse a progress file into an array of entries.
|
|
43
|
+
*
|
|
44
|
+
* Each line is expected to follow the format:
|
|
45
|
+
* `YYYY-MM-DD HH:MM | KEY | summary | STATUS [| pr:N] [| parent:KEY]`
|
|
46
|
+
*
|
|
47
|
+
* The `pr:` and `parent:` suffixes can appear in any order after the status.
|
|
48
|
+
* Uses named-prefix matching to identify these fields rather than positional
|
|
49
|
+
* indexing, ensuring backward compatibility with entries that lack them.
|
|
50
|
+
*
|
|
51
|
+
* Lines that don't match the minimum format are silently skipped.
|
|
52
|
+
*/
|
|
53
|
+
export declare function parseProgressFile(projectRoot: string): ProgressEntry[];
|
|
41
54
|
/**
|
|
42
55
|
* Find the last progress entry for a given ticket key.
|
|
43
56
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../../../src/scripts/shared/progress/progress.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,mDAAmD;AACnD,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAQlD;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,cAAc,CAC5B,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,cAAc,EACtB,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,IAAI,CAoBN;
|
|
1
|
+
{"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../../../src/scripts/shared/progress/progress.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,mDAAmD;AACnD,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAQlD;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,cAAc,CAC5B,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,cAAc,EACtB,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,IAAI,CAoBN;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,EAAE,CAoFtE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAC3B,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,GACV,aAAa,GAAG,SAAS,CAY3B;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAY1E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,cAAc,GACrB,aAAa,EAAE,CASjB"}
|
|
@@ -70,7 +70,7 @@ export function appendProgress(projectRoot, key, summary, status, prNumber, pare
|
|
|
70
70
|
*
|
|
71
71
|
* Lines that don't match the minimum format are silently skipped.
|
|
72
72
|
*/
|
|
73
|
-
function parseProgressFile(projectRoot) {
|
|
73
|
+
export function parseProgressFile(projectRoot) {
|
|
74
74
|
const filePath = join(projectRoot, '.clancy', 'progress.txt');
|
|
75
75
|
let content;
|
|
76
76
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../../../src/scripts/shared/progress/progress.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAc1C;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,IAAU;IACxC,MAAM,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;IAChC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC3D,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACrD,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACtD,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAEzD,OAAO,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;AACtC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,cAAc,CAC5B,WAAmB,EACnB,GAAW,EACX,OAAe,EACf,MAAsB,EACtB,QAAiB,EACjB,MAAe;IAEf,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;IAE9D,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAElD,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAE9C,gFAAgF;IAChF,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,eAAe,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,GAAG,SAAS,MAAM,MAAM,MAAM,GAAG,MAAM,OAAO,IAAI,CAAC;QAChE,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACvC,OAAO;IACT,CAAC;IAED,8EAA8E;IAC9E,MAAM,QAAQ,GAAG,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7D,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,aAAa,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACzD,MAAM,IAAI,GAAG,GAAG,SAAS,MAAM,GAAG,MAAM,OAAO,MAAM,MAAM,GAAG,QAAQ,GAAG,YAAY,IAAI,CAAC;IAE1F,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AACzC,CAAC;AAED;;;;;;;;;;;GAWG;AACH,
|
|
1
|
+
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../../../src/scripts/shared/progress/progress.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,9 +23,10 @@ export declare function isEpicBranch(targetBranch: string): boolean;
|
|
|
23
23
|
* @param config - The board configuration.
|
|
24
24
|
* @param ticket - The ticket being implemented.
|
|
25
25
|
* @param targetBranch - The branch the PR targets (used to determine `Closes` vs `Part of`).
|
|
26
|
+
* @param verificationWarning - Optional warning text when verification checks failed after max retries. Included as a `## Verification Warning` section before the footer.
|
|
26
27
|
* @returns The PR body as a markdown string.
|
|
27
28
|
*/
|
|
28
|
-
export declare function buildPrBody(config: BoardConfig, ticket: Ticket, targetBranch?: string): string;
|
|
29
|
+
export declare function buildPrBody(config: BoardConfig, ticket: Ticket, targetBranch?: string, verificationWarning?: string): string;
|
|
29
30
|
/**
|
|
30
31
|
* Build the PR body for the final epic PR (epic branch → base branch).
|
|
31
32
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pr-body.d.ts","sourceRoot":"","sources":["../../../../../src/scripts/shared/pull-request/pr-body/pr-body.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE5D;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAI1D;AAED
|
|
1
|
+
{"version":3,"file":"pr-body.d.ts","sourceRoot":"","sources":["../../../../../src/scripts/shared/pull-request/pr-body/pr-body.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE5D;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAI1D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,MAAM,EACrB,mBAAmB,CAAC,EAAE,MAAM,GAC3B,MAAM,CA4DR;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,aAAa,EAAE,GAC5B,MAAM,CAkBR"}
|
|
@@ -17,9 +17,10 @@ export function isEpicBranch(targetBranch) {
|
|
|
17
17
|
* @param config - The board configuration.
|
|
18
18
|
* @param ticket - The ticket being implemented.
|
|
19
19
|
* @param targetBranch - The branch the PR targets (used to determine `Closes` vs `Part of`).
|
|
20
|
+
* @param verificationWarning - Optional warning text when verification checks failed after max retries. Included as a `## Verification Warning` section before the footer.
|
|
20
21
|
* @returns The PR body as a markdown string.
|
|
21
22
|
*/
|
|
22
|
-
export function buildPrBody(config, ticket, targetBranch) {
|
|
23
|
+
export function buildPrBody(config, ticket, targetBranch, verificationWarning) {
|
|
23
24
|
const lines = [];
|
|
24
25
|
const isEpic = targetBranch ? isEpicBranch(targetBranch) : false;
|
|
25
26
|
switch (config.provider) {
|
|
@@ -40,6 +41,14 @@ export function buildPrBody(config, ticket, targetBranch) {
|
|
|
40
41
|
lines.push(ticket.description);
|
|
41
42
|
lines.push('');
|
|
42
43
|
}
|
|
44
|
+
if (verificationWarning) {
|
|
45
|
+
lines.push('## ⚠ Verification Warning');
|
|
46
|
+
lines.push('');
|
|
47
|
+
lines.push(verificationWarning);
|
|
48
|
+
lines.push('');
|
|
49
|
+
lines.push('This PR may need manual fixes before merging.');
|
|
50
|
+
lines.push('');
|
|
51
|
+
}
|
|
43
52
|
lines.push('---');
|
|
44
53
|
lines.push('*Created by [Clancy](https://github.com/Pushedskydiver/clancy)*');
|
|
45
54
|
lines.push('');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pr-body.js","sourceRoot":"","sources":["../../../../../src/scripts/shared/pull-request/pr-body/pr-body.ts"],"names":[],"mappings":"AASA;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,YAAoB;IAC/C,OAAO,CACL,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,YAAY,CAAC,UAAU,CAAC,YAAY,CAAC,CAC1E,CAAC;AACJ,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"pr-body.js","sourceRoot":"","sources":["../../../../../src/scripts/shared/pull-request/pr-body/pr-body.ts"],"names":[],"mappings":"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"}
|
package/dist/types/remote.d.ts
CHANGED
|
@@ -51,5 +51,5 @@ export type PrReviewState = {
|
|
|
51
51
|
reviewers?: string[];
|
|
52
52
|
};
|
|
53
53
|
/** Progress log status values. */
|
|
54
|
-
export type ProgressStatus = 'DONE' | 'SKIPPED' | 'PR_CREATED' | 'PUSHED' | 'PUSH_FAILED' | 'LOCAL' | 'PLAN' | 'APPROVE_PLAN' | 'REWORK' | 'EPIC_PR_CREATED' | 'BRIEF' | 'APPROVE_BRIEF';
|
|
54
|
+
export type ProgressStatus = 'DONE' | 'SKIPPED' | 'PR_CREATED' | 'PUSHED' | 'PUSH_FAILED' | 'LOCAL' | 'PLAN' | 'APPROVE_PLAN' | 'REWORK' | 'EPIC_PR_CREATED' | 'BRIEF' | 'APPROVE_BRIEF' | 'TIME_LIMIT' | 'RESUMED';
|
|
55
55
|
//# sourceMappingURL=remote.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote.d.ts","sourceRoot":"","sources":["../../src/types/remote.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,uCAAuC;AACvC,MAAM,MAAM,WAAW,GACnB,QAAQ,GACR,QAAQ,GACR,WAAW,GACX,kBAAkB,GAClB,OAAO,GACP,SAAS,CAAC;AAEd,qDAAqD;AACrD,MAAM,MAAM,UAAU,GAClB;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB,GACD;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB,GACD;IACE,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,GACD;IACE,IAAI,EAAE,kBAAkB,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,GACD;IACE,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;CACb,GACD;IACE,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEN,0CAA0C;AAC1C,MAAM,MAAM,gBAAgB,GACxB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAE1D,6CAA6C;AAC7C,MAAM,MAAM,aAAa,GAAG;IAC1B,yDAAyD;IACzD,gBAAgB,EAAE,OAAO,CAAC;IAC1B,sDAAsD;IACtD,QAAQ,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC;AAEF,kCAAkC;AAClC,MAAM,MAAM,cAAc,GACtB,MAAM,GACN,SAAS,GACT,YAAY,GACZ,QAAQ,GACR,aAAa,GACb,OAAO,GACP,MAAM,GACN,cAAc,GACd,QAAQ,GACR,iBAAiB,GACjB,OAAO,GACP,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"remote.d.ts","sourceRoot":"","sources":["../../src/types/remote.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,uCAAuC;AACvC,MAAM,MAAM,WAAW,GACnB,QAAQ,GACR,QAAQ,GACR,WAAW,GACX,kBAAkB,GAClB,OAAO,GACP,SAAS,CAAC;AAEd,qDAAqD;AACrD,MAAM,MAAM,UAAU,GAClB;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB,GACD;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB,GACD;IACE,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,GACD;IACE,IAAI,EAAE,kBAAkB,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,GACD;IACE,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;CACb,GACD;IACE,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEN,0CAA0C;AAC1C,MAAM,MAAM,gBAAgB,GACxB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAE1D,6CAA6C;AAC7C,MAAM,MAAM,aAAa,GAAG;IAC1B,yDAAyD;IACzD,gBAAgB,EAAE,OAAO,CAAC;IAC1B,sDAAsD;IACtD,QAAQ,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC;AAEF,kCAAkC;AAClC,MAAM,MAAM,cAAc,GACtB,MAAM,GACN,SAAS,GACT,YAAY,GACZ,QAAQ,GACR,aAAa,GACb,OAAO,GACP,MAAM,GACN,cAAc,GACd,QAAQ,GACR,iBAAiB,GACjB,OAAO,GACP,eAAe,GACf,YAAY,GACZ,SAAS,CAAC"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Clancy Branch Guard — PreToolUse hook.
|
|
3
|
+
// Blocks dangerous git operations: force push, push to protected branches,
|
|
4
|
+
// hard reset, clean, bulk discard, and force branch deletion.
|
|
5
|
+
// Best-effort — never blocks on error (fail-open).
|
|
6
|
+
|
|
7
|
+
'use strict';
|
|
8
|
+
|
|
9
|
+
// Protected branch names — pushes to these are blocked.
|
|
10
|
+
// CLANCY_BASE_BRANCH is added dynamically if set and not already in the list.
|
|
11
|
+
const PROTECTED_BRANCHES = ['main', 'master', 'develop'];
|
|
12
|
+
if (process.env.CLANCY_BASE_BRANCH && !PROTECTED_BRANCHES.includes(process.env.CLANCY_BASE_BRANCH)) {
|
|
13
|
+
PROTECTED_BRANCHES.push(process.env.CLANCY_BASE_BRANCH);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Check whether a command string contains a dangerous git operation.
|
|
18
|
+
* Returns a reason string if blocked, or null if allowed.
|
|
19
|
+
*/
|
|
20
|
+
function checkCommand(cmd) {
|
|
21
|
+
if (!cmd || typeof cmd !== 'string') return null;
|
|
22
|
+
|
|
23
|
+
// --- git push --force / -f (without --force-with-lease) ---
|
|
24
|
+
// Match any occurrence of "git push" with --force or -f flag
|
|
25
|
+
if (/\bgit\s+push\b/.test(cmd)) {
|
|
26
|
+
const hasForceFlag = /\s--force\b/.test(cmd) || /\s-f\b/.test(cmd);
|
|
27
|
+
const hasForceWithLease = /--force-with-lease\b/.test(cmd);
|
|
28
|
+
if (hasForceFlag && !hasForceWithLease) {
|
|
29
|
+
return 'Blocked: git push --force destroys remote history. Use --force-with-lease instead.';
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// --- git push to protected branches ---
|
|
33
|
+
// Pattern: git push <remote> <protected-branch>
|
|
34
|
+
// We look for "git push" followed by any remote name, then a protected branch.
|
|
35
|
+
// The branch must be a standalone token — \b treats hyphens as word boundaries,
|
|
36
|
+
// so we match the branch as a complete whitespace-delimited token instead.
|
|
37
|
+
for (const branch of PROTECTED_BRANCHES) {
|
|
38
|
+
// Matches: git push origin main, git push origin main:main, etc.
|
|
39
|
+
// Does NOT match: git push origin main-feature
|
|
40
|
+
// Escape regex metacharacters in branch name (e.g. release/1.0 → release\/1\.0)
|
|
41
|
+
const escaped = branch.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
42
|
+
const pattern = new RegExp(`\\bgit\\s+push\\s+\\S+\\s+${escaped}(?:\\s|$|:)`);
|
|
43
|
+
if (pattern.test(cmd)) {
|
|
44
|
+
return `Blocked: direct push to protected branch '${branch}'. Create a PR instead.`;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// --- git reset --hard ---
|
|
50
|
+
if (/\bgit\s+reset\s+--hard\b/.test(cmd)) {
|
|
51
|
+
return 'Blocked: git reset --hard destroys uncommitted work. Use --soft or --mixed instead.';
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// --- git clean -f (any variant with -f but not just -n) ---
|
|
55
|
+
// Block git clean with -f flag (e.g. -f, -fd, -fdx, -xfd, etc.) but allow -n (dry run)
|
|
56
|
+
if (/\bgit\s+clean\b/.test(cmd)) {
|
|
57
|
+
// Check for -f flag in the clean arguments
|
|
58
|
+
// Match short flags like -f, -fd, -fdx, -xf, etc.
|
|
59
|
+
const cleanMatch = cmd.match(/\bgit\s+clean\s+(.*)/);
|
|
60
|
+
if (cleanMatch) {
|
|
61
|
+
const args = cleanMatch[1];
|
|
62
|
+
// Check for -f in combined short flags or standalone
|
|
63
|
+
if (/(?:^|\s)-[a-zA-Z]*f/.test(args) && !/(?:^|\s)-n\b/.test(args)) {
|
|
64
|
+
return 'Blocked: git clean -f deletes untracked files permanently. Use -n for a dry run first.';
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// --- git checkout -- . (discard all changes) ---
|
|
70
|
+
if (/\bgit\s+checkout\s+--\s+\./.test(cmd)) {
|
|
71
|
+
return 'Blocked: git checkout -- . discards all uncommitted changes.';
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// --- git restore . (discard all changes) ---
|
|
75
|
+
// Only block bare "git restore ." (all files), not "git restore ./specific-file"
|
|
76
|
+
if (/\bgit\s+restore\s+\.(?:\s*$|\s*[;&|])/.test(cmd)) {
|
|
77
|
+
return 'Blocked: git restore . discards all uncommitted changes.';
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// --- git branch -D (force delete) ---
|
|
81
|
+
// Block uppercase -D only, not lowercase -d
|
|
82
|
+
if (/\bgit\s+branch\s+.*-D\b/.test(cmd)) {
|
|
83
|
+
return 'Blocked: git branch -D force-deletes a branch irrecoverably. Use -d for safe deletion.';
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Read hook input — Claude Code passes PreToolUse data as a JSON argument.
|
|
90
|
+
// Fall back to stdin for forward compatibility with potential API changes.
|
|
91
|
+
function readInput() {
|
|
92
|
+
if (process.argv[2]) return process.argv[2];
|
|
93
|
+
try { return require('fs').readFileSync('/dev/stdin', 'utf8'); } catch { return '{}'; }
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
try {
|
|
97
|
+
// Check if guard is disabled
|
|
98
|
+
if (process.env.CLANCY_BRANCH_GUARD === 'false') {
|
|
99
|
+
console.log(JSON.stringify({ decision: 'approve' }));
|
|
100
|
+
process.exit(0);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const input = JSON.parse(readInput());
|
|
104
|
+
const toolName = input.tool_name || '';
|
|
105
|
+
const toolInput = input.tool_input || {};
|
|
106
|
+
|
|
107
|
+
// Only check Bash tool calls
|
|
108
|
+
if (toolName !== 'Bash') {
|
|
109
|
+
console.log(JSON.stringify({ decision: 'approve' }));
|
|
110
|
+
process.exit(0);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const cmd = (toolInput.command || '').trim();
|
|
114
|
+
const reason = checkCommand(cmd);
|
|
115
|
+
|
|
116
|
+
if (reason) {
|
|
117
|
+
console.log(JSON.stringify({ decision: 'block', reason }));
|
|
118
|
+
} else {
|
|
119
|
+
console.log(JSON.stringify({ decision: 'approve' }));
|
|
120
|
+
}
|
|
121
|
+
} catch {
|
|
122
|
+
// Best-effort — never block on error
|
|
123
|
+
console.log(JSON.stringify({ decision: 'approve' }));
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Export for testing
|
|
127
|
+
if (typeof module !== 'undefined') {
|
|
128
|
+
module.exports = { checkCommand };
|
|
129
|
+
}
|
|
@@ -3,11 +3,17 @@
|
|
|
3
3
|
// Reads context metrics from the bridge file written by clancy-statusline.js
|
|
4
4
|
// and injects warnings into Claude's conversation when context runs low.
|
|
5
5
|
//
|
|
6
|
-
//
|
|
6
|
+
// Context thresholds:
|
|
7
7
|
// WARNING (remaining <= 35%): wrap up analysis, move to implementation
|
|
8
8
|
// CRITICAL (remaining <= 25%): commit current work, log to .clancy/progress.txt, stop
|
|
9
9
|
//
|
|
10
|
+
// Time guard:
|
|
11
|
+
// Reads .clancy/lock.json for startedAt timestamp.
|
|
12
|
+
// WARNING (elapsed >= 80% of CLANCY_TIME_LIMIT): wrap up implementation
|
|
13
|
+
// CRITICAL (elapsed >= 100% of CLANCY_TIME_LIMIT): stop and deliver
|
|
14
|
+
//
|
|
10
15
|
// Debounce: 5 tool uses between warnings; severity escalation bypasses debounce.
|
|
16
|
+
// Context and time guards use independent debounce counters.
|
|
11
17
|
|
|
12
18
|
'use strict';
|
|
13
19
|
|
|
@@ -19,6 +25,7 @@ const WARNING_THRESHOLD = 35;
|
|
|
19
25
|
const CRITICAL_THRESHOLD = 25;
|
|
20
26
|
const STALE_SECONDS = 60;
|
|
21
27
|
const DEBOUNCE_CALLS = 5;
|
|
28
|
+
const DEFAULT_TIME_LIMIT = 30; // minutes
|
|
22
29
|
|
|
23
30
|
let input = '';
|
|
24
31
|
const stdinTimeout = setTimeout(() => process.exit(0), 3000);
|
|
@@ -31,66 +38,147 @@ process.stdin.on('end', () => {
|
|
|
31
38
|
const session = data.session_id;
|
|
32
39
|
if (!session) process.exit(0);
|
|
33
40
|
|
|
34
|
-
const
|
|
35
|
-
if (!fs.existsSync(bridgePath)) process.exit(0); // no statusline data yet
|
|
36
|
-
|
|
37
|
-
const metrics = JSON.parse(fs.readFileSync(bridgePath, 'utf8'));
|
|
38
|
-
const now = Math.floor(Date.now() / 1000);
|
|
39
|
-
|
|
40
|
-
// Ignore stale metrics (statusline may not have run this session)
|
|
41
|
-
if (metrics.timestamp && (now - metrics.timestamp) > STALE_SECONDS) process.exit(0);
|
|
42
|
-
|
|
43
|
-
const remaining = metrics.remaining_percentage;
|
|
44
|
-
const usedPct = metrics.used_pct;
|
|
45
|
-
|
|
46
|
-
if (remaining > WARNING_THRESHOLD) process.exit(0);
|
|
41
|
+
const messages = [];
|
|
47
42
|
|
|
48
|
-
//
|
|
43
|
+
// ── Warn file (shared by context + time debounce) ───────────
|
|
49
44
|
const warnPath = path.join(os.tmpdir(), `clancy-ctx-${session}-warned.json`);
|
|
50
|
-
let warnData = {
|
|
51
|
-
|
|
45
|
+
let warnData = {
|
|
46
|
+
callsSinceWarn: 0,
|
|
47
|
+
lastLevel: null,
|
|
48
|
+
timeCallsSinceWarn: 0,
|
|
49
|
+
timeLastLevel: null,
|
|
50
|
+
};
|
|
51
|
+
let firstContextWarn = true;
|
|
52
|
+
let firstTimeWarn = true;
|
|
52
53
|
|
|
53
54
|
if (fs.existsSync(warnPath)) {
|
|
54
|
-
try {
|
|
55
|
+
try {
|
|
56
|
+
const existing = JSON.parse(fs.readFileSync(warnPath, 'utf8'));
|
|
57
|
+
warnData = { ...warnData, ...existing };
|
|
58
|
+
firstContextWarn = !existing.lastLevel;
|
|
59
|
+
firstTimeWarn = !existing.timeLastLevel;
|
|
60
|
+
} catch {}
|
|
55
61
|
}
|
|
56
62
|
|
|
57
|
-
|
|
63
|
+
// ── Context guard ───────────────────────────────────────────
|
|
64
|
+
const bridgePath = path.join(os.tmpdir(), `clancy-ctx-${session}.json`);
|
|
65
|
+
let contextFired = false;
|
|
66
|
+
|
|
67
|
+
if (fs.existsSync(bridgePath)) {
|
|
68
|
+
const metrics = JSON.parse(fs.readFileSync(bridgePath, 'utf8'));
|
|
69
|
+
const now = Math.floor(Date.now() / 1000);
|
|
70
|
+
|
|
71
|
+
const isStale = metrics.timestamp && (now - metrics.timestamp) > STALE_SECONDS;
|
|
72
|
+
if (!isStale) {
|
|
73
|
+
const remaining = metrics.remaining_percentage;
|
|
74
|
+
const usedPct = metrics.used_pct;
|
|
75
|
+
|
|
76
|
+
if (remaining <= WARNING_THRESHOLD) {
|
|
77
|
+
warnData.callsSinceWarn = (warnData.callsSinceWarn || 0) + 1;
|
|
78
|
+
|
|
79
|
+
const isCritical = remaining <= CRITICAL_THRESHOLD;
|
|
80
|
+
const currentLevel = isCritical ? 'critical' : 'warning';
|
|
81
|
+
const severityEscalated = currentLevel === 'critical' && warnData.lastLevel === 'warning';
|
|
82
|
+
|
|
83
|
+
const shouldFire = firstContextWarn ||
|
|
84
|
+
warnData.callsSinceWarn >= DEBOUNCE_CALLS ||
|
|
85
|
+
severityEscalated;
|
|
86
|
+
|
|
87
|
+
if (shouldFire) {
|
|
88
|
+
warnData.callsSinceWarn = 0;
|
|
89
|
+
warnData.lastLevel = currentLevel;
|
|
90
|
+
contextFired = true;
|
|
91
|
+
|
|
92
|
+
if (isCritical) {
|
|
93
|
+
messages.push(
|
|
94
|
+
`CONTEXT CRITICAL: Usage at ${usedPct}%. Remaining: ${remaining}%. ` +
|
|
95
|
+
'Context is nearly exhausted. Stop reading files and wrap up immediately:\n' +
|
|
96
|
+
'1. Commit whatever work is staged on the current feature branch\n' +
|
|
97
|
+
'2. Append a WIP entry to .clancy/progress.txt: ' +
|
|
98
|
+
'YYYY-MM-DD HH:MM | TICKET-KEY | Summary | WIP — context exhausted\n' +
|
|
99
|
+
'3. Inform the user what was completed and what remains.\n' +
|
|
100
|
+
'Do NOT start any new work.'
|
|
101
|
+
);
|
|
102
|
+
} else {
|
|
103
|
+
messages.push(
|
|
104
|
+
`CONTEXT WARNING: Usage at ${usedPct}%. Remaining: ${remaining}%. ` +
|
|
105
|
+
'Context is getting limited. Stop exploring and move to implementation. ' +
|
|
106
|
+
'Avoid reading additional files unless strictly necessary. ' +
|
|
107
|
+
'Commit completed work as soon as it is ready.'
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
58
114
|
|
|
59
|
-
|
|
60
|
-
const
|
|
61
|
-
const
|
|
115
|
+
// ── Time guard ──────────────────────────────────────────────
|
|
116
|
+
const timeLimitEnv = process.env.CLANCY_TIME_LIMIT;
|
|
117
|
+
const timeLimit = timeLimitEnv !== undefined ? Number(timeLimitEnv) : DEFAULT_TIME_LIMIT;
|
|
118
|
+
|
|
119
|
+
if (timeLimit > 0) {
|
|
120
|
+
// Look for lock.json in the working directory's .clancy/
|
|
121
|
+
const cwd = data.cwd || process.cwd();
|
|
122
|
+
const lockPath = path.join(cwd, '.clancy', 'lock.json');
|
|
123
|
+
|
|
124
|
+
if (fs.existsSync(lockPath)) {
|
|
125
|
+
try {
|
|
126
|
+
const lock = JSON.parse(fs.readFileSync(lockPath, 'utf8'));
|
|
127
|
+
const startedAt = new Date(lock.startedAt);
|
|
128
|
+
|
|
129
|
+
if (!isNaN(startedAt.getTime())) {
|
|
130
|
+
const elapsedMs = Date.now() - startedAt.getTime();
|
|
131
|
+
const elapsedMin = Math.floor(elapsedMs / 60000);
|
|
132
|
+
const limitMs = timeLimit * 60000;
|
|
133
|
+
const pct = Math.floor((elapsedMs / limitMs) * 100);
|
|
134
|
+
|
|
135
|
+
if (pct >= 80) {
|
|
136
|
+
warnData.timeCallsSinceWarn = (warnData.timeCallsSinceWarn || 0) + 1;
|
|
137
|
+
|
|
138
|
+
const isTimeCritical = pct >= 100;
|
|
139
|
+
const currentTimeLevel = isTimeCritical ? 'critical' : 'warning';
|
|
140
|
+
const timeSeverityEscalated =
|
|
141
|
+
currentTimeLevel === 'critical' && warnData.timeLastLevel === 'warning';
|
|
142
|
+
|
|
143
|
+
const shouldFireTime = firstTimeWarn ||
|
|
144
|
+
warnData.timeCallsSinceWarn >= DEBOUNCE_CALLS ||
|
|
145
|
+
timeSeverityEscalated;
|
|
146
|
+
|
|
147
|
+
if (shouldFireTime) {
|
|
148
|
+
warnData.timeCallsSinceWarn = 0;
|
|
149
|
+
warnData.timeLastLevel = currentTimeLevel;
|
|
150
|
+
|
|
151
|
+
if (isTimeCritical) {
|
|
152
|
+
messages.push(
|
|
153
|
+
`TIME CRITICAL: Time limit reached (${elapsedMin}min of ${timeLimit}min).\n` +
|
|
154
|
+
'STOP implementation immediately. Commit current work, push the branch,\n' +
|
|
155
|
+
'and create the PR with whatever is ready. Log a WIP entry if incomplete.'
|
|
156
|
+
);
|
|
157
|
+
} else {
|
|
158
|
+
messages.push(
|
|
159
|
+
`TIME WARNING: Ticket implementation at ${elapsedMin}min of ${timeLimit}min limit (${pct}%).\n` +
|
|
160
|
+
'Wrap up implementation and prepare for delivery. Avoid starting new approaches.'
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
} catch {}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
62
169
|
|
|
63
|
-
|
|
170
|
+
// ── Persist debounce state (only when a threshold was reached) ──
|
|
171
|
+
if (messages.length > 0 || contextFired || warnData.callsSinceWarn > 0 || warnData.timeCallsSinceWarn > 0) {
|
|
64
172
|
fs.writeFileSync(warnPath, JSON.stringify(warnData));
|
|
65
|
-
process.exit(0);
|
|
66
173
|
}
|
|
67
174
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
fs.writeFileSync(warnPath, JSON.stringify(warnData));
|
|
71
|
-
|
|
72
|
-
let message;
|
|
73
|
-
if (isCritical) {
|
|
74
|
-
message =
|
|
75
|
-
`CONTEXT CRITICAL: Usage at ${usedPct}%. Remaining: ${remaining}%. ` +
|
|
76
|
-
'Context is nearly exhausted. Stop reading files and wrap up immediately:\n' +
|
|
77
|
-
'1. Commit whatever work is staged on the current feature branch\n' +
|
|
78
|
-
'2. Append a WIP entry to .clancy/progress.txt: ' +
|
|
79
|
-
'YYYY-MM-DD HH:MM | TICKET-KEY | Summary | WIP — context exhausted\n' +
|
|
80
|
-
'3. Inform the user what was completed and what remains.\n' +
|
|
81
|
-
'Do NOT start any new work.';
|
|
82
|
-
} else {
|
|
83
|
-
message =
|
|
84
|
-
`CONTEXT WARNING: Usage at ${usedPct}%. Remaining: ${remaining}%. ` +
|
|
85
|
-
'Context is getting limited. Stop exploring and move to implementation. ' +
|
|
86
|
-
'Avoid reading additional files unless strictly necessary. ' +
|
|
87
|
-
'Commit completed work as soon as it is ready.';
|
|
88
|
-
}
|
|
175
|
+
// ── Output ──────────────────────────────────────────────────
|
|
176
|
+
if (messages.length === 0) process.exit(0);
|
|
89
177
|
|
|
90
178
|
const output = {
|
|
91
179
|
hookSpecificOutput: {
|
|
92
180
|
hookEventName: 'PostToolUse',
|
|
93
|
-
additionalContext:
|
|
181
|
+
additionalContext: messages.join('\n'),
|
|
94
182
|
},
|
|
95
183
|
};
|
|
96
184
|
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Clancy PostCompact Hook — re-injects ticket context after context compaction.
|
|
3
|
+
// Reads .clancy/lock.json for current ticket info. If no lock file exists
|
|
4
|
+
// (not in a Clancy run), exits silently.
|
|
5
|
+
//
|
|
6
|
+
// PostCompact is a non-blocking event — this hook injects additionalContext
|
|
7
|
+
// but cannot prevent compaction.
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const fs = require('fs');
|
|
12
|
+
const path = require('path');
|
|
13
|
+
|
|
14
|
+
let input = '';
|
|
15
|
+
const stdinTimeout = setTimeout(() => process.exit(0), 3000);
|
|
16
|
+
process.stdin.setEncoding('utf8');
|
|
17
|
+
process.stdin.on('data', chunk => { input += chunk; });
|
|
18
|
+
process.stdin.on('end', () => {
|
|
19
|
+
clearTimeout(stdinTimeout);
|
|
20
|
+
try {
|
|
21
|
+
const data = JSON.parse(input);
|
|
22
|
+
const cwd = data.cwd || process.cwd();
|
|
23
|
+
|
|
24
|
+
// Read lock file for ticket context
|
|
25
|
+
const lockPath = path.join(cwd, '.clancy', 'lock.json');
|
|
26
|
+
if (!fs.existsSync(lockPath)) process.exit(0); // Not in a Clancy run
|
|
27
|
+
|
|
28
|
+
const lock = JSON.parse(fs.readFileSync(lockPath, 'utf8'));
|
|
29
|
+
|
|
30
|
+
// Validate minimum required fields — skip if lock is malformed
|
|
31
|
+
if (!lock.ticketKey || !lock.ticketBranch) process.exit(0);
|
|
32
|
+
|
|
33
|
+
// Truncate description to 2000 chars to avoid consuming too much fresh context
|
|
34
|
+
const desc = (lock.description || '').slice(0, 2000);
|
|
35
|
+
|
|
36
|
+
const context = [
|
|
37
|
+
`CONTEXT RESTORED: You are implementing ticket [${lock.ticketKey}] ${lock.ticketTitle || 'Unknown'}.`,
|
|
38
|
+
`Branch: ${lock.ticketBranch} targeting ${lock.targetBranch || 'main'}.`,
|
|
39
|
+
lock.parentKey && lock.parentKey !== 'none' ? `Parent: ${lock.parentKey}.` : '',
|
|
40
|
+
desc ? `Requirements: ${desc}` : '',
|
|
41
|
+
'Continue your implementation. Do not start over.',
|
|
42
|
+
].filter(Boolean).join('\n');
|
|
43
|
+
|
|
44
|
+
process.stdout.write(JSON.stringify({
|
|
45
|
+
hookSpecificOutput: {
|
|
46
|
+
hookEventName: 'PostCompact',
|
|
47
|
+
additionalContext: context,
|
|
48
|
+
},
|
|
49
|
+
}));
|
|
50
|
+
} catch {
|
|
51
|
+
process.exit(0); // Best-effort — never crash
|
|
52
|
+
}
|
|
53
|
+
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "chief-clancy",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "Autonomous, board-driven development for Claude Code — scaffolds docs, integrates Kanban boards, runs tickets in a loop.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"claude",
|
|
@@ -30,7 +30,8 @@
|
|
|
30
30
|
"main": "dist/installer/install.js",
|
|
31
31
|
"files": [
|
|
32
32
|
"dist/",
|
|
33
|
-
"hooks
|
|
33
|
+
"hooks/*.js",
|
|
34
|
+
"hooks/package.json",
|
|
34
35
|
"src/roles/",
|
|
35
36
|
"src/agents/",
|
|
36
37
|
"src/templates/",
|