@agent-profile/web 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/build/client/_app/immutable/chunks/Bjy-W4x2.js +81 -0
- package/build/client/_app/immutable/chunks/Bjy-W4x2.js.br +0 -0
- package/build/client/_app/immutable/chunks/Bjy-W4x2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{BcMnim1Z.js → BmxQso7w.js} +1 -1
- package/build/client/_app/immutable/chunks/BmxQso7w.js.br +3 -0
- package/build/client/_app/immutable/chunks/BmxQso7w.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CY-inT3H.js +3 -0
- package/build/client/_app/immutable/chunks/CY-inT3H.js.br +0 -0
- package/build/client/_app/immutable/chunks/CY-inT3H.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{DTBN031P.js → CyEm9M8C.js} +1 -1
- package/build/client/_app/immutable/chunks/CyEm9M8C.js.br +0 -0
- package/build/client/_app/immutable/chunks/CyEm9M8C.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DYl5dUZ5.js +1 -0
- package/build/client/_app/immutable/chunks/DYl5dUZ5.js.br +0 -0
- package/build/client/_app/immutable/chunks/DYl5dUZ5.js.gz +0 -0
- package/build/client/_app/immutable/chunks/RwRNRscK.js +2 -0
- package/build/client/_app/immutable/chunks/RwRNRscK.js.br +0 -0
- package/build/client/_app/immutable/chunks/RwRNRscK.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{D5fBh0I2.js → YBkAuHc6.js} +1 -1
- package/build/client/_app/immutable/chunks/YBkAuHc6.js.br +0 -0
- package/build/client/_app/immutable/chunks/YBkAuHc6.js.gz +0 -0
- package/build/client/_app/immutable/chunks/jSRqCab7.js +1 -0
- package/build/client/_app/immutable/chunks/jSRqCab7.js.br +2 -0
- package/build/client/_app/immutable/chunks/jSRqCab7.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.WDp3PboB.js +2 -0
- package/build/client/_app/immutable/entry/app.WDp3PboB.js.br +0 -0
- package/build/client/_app/immutable/entry/app.WDp3PboB.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.Rh_k7Qxe.js +1 -0
- package/build/client/_app/immutable/entry/start.Rh_k7Qxe.js.br +0 -0
- package/build/client/_app/immutable/entry/start.Rh_k7Qxe.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.-RAEeCLa.js +1 -0
- package/build/client/_app/immutable/nodes/0.-RAEeCLa.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.-RAEeCLa.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.34MuZTH7.js +1 -0
- package/build/client/_app/immutable/nodes/1.34MuZTH7.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.34MuZTH7.js.gz +0 -0
- package/build/client/_app/immutable/nodes/10.DplzwNzq.js +3 -0
- package/build/client/_app/immutable/nodes/10.DplzwNzq.js.br +0 -0
- package/build/client/_app/immutable/nodes/10.DplzwNzq.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{11.3lkgWYOd.js → 11.DvcCox6n.js} +1 -1
- package/build/client/_app/immutable/nodes/11.DvcCox6n.js.br +0 -0
- package/build/client/_app/immutable/nodes/11.DvcCox6n.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{12.p6ol8gkx.js → 12.Cb49Qjng.js} +1 -1
- package/build/client/_app/immutable/nodes/12.Cb49Qjng.js.br +0 -0
- package/build/client/_app/immutable/nodes/12.Cb49Qjng.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{2.Clary1Ks.js → 2.DNGHCEWB.js} +2 -2
- package/build/client/_app/immutable/nodes/2.DNGHCEWB.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.DNGHCEWB.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{3.BBvN4Erf.js → 3.BEdWeod6.js} +1 -1
- package/build/client/_app/immutable/nodes/3.BEdWeod6.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.BEdWeod6.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{4.3VL8fZOS.js → 4.C4b1rN7s.js} +1 -1
- package/build/client/_app/immutable/nodes/4.C4b1rN7s.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.C4b1rN7s.js.gz +0 -0
- package/build/client/_app/immutable/nodes/5.DrqRX385.js +2 -0
- package/build/client/_app/immutable/nodes/5.DrqRX385.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.DrqRX385.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{6.BRCCYakl.js → 6.BiWHXice.js} +1 -1
- package/build/client/_app/immutable/nodes/6.BiWHXice.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.BiWHXice.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{7._DA-s9Iz.js → 7.BNVGtd7p.js} +1 -1
- package/build/client/_app/immutable/nodes/7.BNVGtd7p.js.br +0 -0
- package/build/client/_app/immutable/nodes/7.BNVGtd7p.js.gz +0 -0
- package/build/client/_app/immutable/nodes/8.jIClO5FX.js +1 -0
- package/build/client/_app/immutable/nodes/8.jIClO5FX.js.br +0 -0
- package/build/client/_app/immutable/nodes/8.jIClO5FX.js.gz +0 -0
- package/build/client/_app/immutable/nodes/9.B7GOogsh.js +9 -0
- package/build/client/_app/immutable/nodes/9.B7GOogsh.js.br +0 -0
- package/build/client/_app/immutable/nodes/9.B7GOogsh.js.gz +0 -0
- package/build/client/_app/version.json +1 -1
- package/build/client/_app/version.json.br +0 -0
- package/build/client/_app/version.json.gz +0 -0
- package/build/env.js +9 -33
- package/build/env.js.map +1 -0
- package/build/handler.js +15 -1493
- package/build/handler.js.map +1 -0
- package/build/index.js +25 -231
- package/build/index.js.map +1 -0
- package/build/server/chunks/{0--J8MXU0r.js → 0-B6UIl8X0.js} +8 -8
- package/build/server/chunks/0-B6UIl8X0.js.map +1 -0
- package/build/server/chunks/1-Dq90EpGp.js +9 -0
- package/build/server/chunks/1-Dq90EpGp.js.map +1 -0
- package/build/server/chunks/{10-CX1ex2mH.js → 10-BM8QtjX8.js} +5 -4
- package/build/server/chunks/10-BM8QtjX8.js.map +1 -0
- package/build/server/chunks/11-FZmITmkZ.js +9 -0
- package/build/server/chunks/11-FZmITmkZ.js.map +1 -0
- package/build/server/chunks/{12-Dw1Y6Xen.js → 12-BlqEGyqp.js} +4 -4
- package/build/server/chunks/12-BlqEGyqp.js.map +1 -0
- package/build/server/chunks/{2-iIDfIUc5.js → 2-D9wmJrmC.js} +3 -3
- package/build/server/chunks/2-D9wmJrmC.js.map +1 -0
- package/build/server/chunks/3-C7b_e-a7.js +9 -0
- package/build/server/chunks/3-C7b_e-a7.js.map +1 -0
- package/build/server/chunks/{4-CKQYCTZo.js → 4-DC34JtHj.js} +6 -6
- package/build/server/chunks/4-DC34JtHj.js.map +1 -0
- package/build/server/chunks/5-vZTj2V8e.js +9 -0
- package/build/server/chunks/5-vZTj2V8e.js.map +1 -0
- package/build/server/chunks/6-ClsuiYR1.js +9 -0
- package/build/server/chunks/6-ClsuiYR1.js.map +1 -0
- package/build/server/chunks/{7-DT_D0EX1.js → 7-CdnU-whk.js} +6 -6
- package/build/server/chunks/7-CdnU-whk.js.map +1 -0
- package/build/server/chunks/8-DGCxm3TB.js +9 -0
- package/build/server/chunks/8-DGCxm3TB.js.map +1 -0
- package/build/server/chunks/{9-BVttRALh.js → 9-BcuWrd-q.js} +5 -5
- package/build/server/chunks/9-BcuWrd-q.js.map +1 -0
- package/build/server/chunks/{Badge-DCQxSQCS.js → Badge-C73znQSJ.js} +2 -2
- package/build/server/chunks/Badge-C73znQSJ.js.map +1 -0
- package/build/server/chunks/{SafetyBadge-BxEGojgX.js → SafetyBadge-DbpkfzSa.js} +2 -2
- package/build/server/chunks/SafetyBadge-DbpkfzSa.js.map +1 -0
- package/build/server/chunks/{_layout.svelte-BPfWfi5Y.js → _layout.svelte-1xu00yiw.js} +4 -6
- package/build/server/chunks/{_layout.svelte-BPfWfi5Y.js.map → _layout.svelte-1xu00yiw.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-xTZOj1o8.js → _page.svelte-4Xfcj342.js} +3 -3
- package/build/server/chunks/_page.svelte-4Xfcj342.js.map +1 -0
- package/build/server/chunks/{_page.svelte-qnfxKUje.js → _page.svelte-8auIN7Qo.js} +24 -21
- package/build/server/chunks/_page.svelte-8auIN7Qo.js.map +1 -0
- package/build/server/chunks/{_page.svelte-wL3fdD1l.js → _page.svelte-BXtL3d0f.js} +4 -4
- package/build/server/chunks/_page.svelte-BXtL3d0f.js.map +1 -0
- package/build/server/chunks/{_page.svelte-B8jThscg.js → _page.svelte-BaxiAFdk.js} +4 -6
- package/build/server/chunks/_page.svelte-BaxiAFdk.js.map +1 -0
- package/build/server/chunks/{_page.svelte-D9DhnmQr.js → _page.svelte-BhsBxk6l.js} +3 -5
- package/build/server/chunks/_page.svelte-BhsBxk6l.js.map +1 -0
- package/build/server/chunks/{_page.svelte-1wUrXGW-.js → _page.svelte-Br7nreH-.js} +4 -5
- package/build/server/chunks/_page.svelte-Br7nreH-.js.map +1 -0
- package/build/server/chunks/{_page.svelte-B1i4IP2u.js → _page.svelte-C1ssMQqB.js} +4 -6
- package/build/server/chunks/_page.svelte-C1ssMQqB.js.map +1 -0
- package/build/server/chunks/{_page.svelte-D8ffqrO3.js → _page.svelte-CZMhLclS.js} +5 -7
- package/build/server/chunks/_page.svelte-CZMhLclS.js.map +1 -0
- package/build/server/chunks/{_page.svelte-NwgcXZfI.js → _page.svelte-DMwgbUjH.js} +6 -7
- package/build/server/chunks/_page.svelte-DMwgbUjH.js.map +1 -0
- package/build/server/chunks/{_page.svelte-B3CasgD8.js → _page.svelte-iNuDNlPL.js} +3 -3
- package/build/server/chunks/_page.svelte-iNuDNlPL.js.map +1 -0
- package/build/server/chunks/{_page.svelte-BikYFdJv.js → _page.svelte-pVxceXG3.js} +5 -5
- package/build/server/chunks/_page.svelte-pVxceXG3.js.map +1 -0
- package/build/server/chunks/{_server.ts-D7iLlRbM.js → _server.ts-B6p7ukMz.js} +4 -5
- package/build/server/chunks/_server.ts-B6p7ukMz.js.map +1 -0
- package/build/server/chunks/{_server.ts-C49ZrV0a.js → _server.ts-BRZfMXBh.js} +2 -2
- package/build/server/chunks/_server.ts-BRZfMXBh.js.map +1 -0
- package/build/server/chunks/{_server.ts-BBDD0W6t.js → _server.ts-CCCiUW1c.js} +3 -4
- package/build/server/chunks/_server.ts-CCCiUW1c.js.map +1 -0
- package/build/server/chunks/{_server.ts-BkOJmVFg.js → _server.ts-CXojCxes.js} +5 -6
- package/build/server/chunks/_server.ts-CXojCxes.js.map +1 -0
- package/build/server/chunks/{_server.ts-rJ_Ubi9D.js → _server.ts-CqIWzdWh.js} +2 -2
- package/build/server/chunks/_server.ts-CqIWzdWh.js.map +1 -0
- package/build/server/chunks/{_server.ts-CaVH9FSD.js → _server.ts-DAqw6tHI.js} +4 -5
- package/build/server/chunks/_server.ts-DAqw6tHI.js.map +1 -0
- package/build/server/chunks/{_server.ts-Dz9oKgWc.js → _server.ts-DFARp0QA.js} +5 -6
- package/build/server/chunks/_server.ts-DFARp0QA.js.map +1 -0
- package/build/server/chunks/{_server.ts-Dwe99x74.js → _server.ts-DcfqVMUN.js} +2 -2
- package/build/server/chunks/_server.ts-DcfqVMUN.js.map +1 -0
- package/build/server/chunks/{_server.ts-DPqZOGG_.js → _server.ts-DqBabNbA.js} +4 -5
- package/build/server/chunks/_server.ts-DqBabNbA.js.map +1 -0
- package/build/server/chunks/{_server.ts-C2WpZqPW.js → _server.ts-DrY2Ctqv.js} +4 -5
- package/build/server/chunks/_server.ts-DrY2Ctqv.js.map +1 -0
- package/build/server/chunks/client-C6wXHlmK.js +24 -0
- package/build/server/chunks/client-C6wXHlmK.js.map +1 -0
- package/build/server/chunks/{doctorSummary-BOtGdd9z.js → doctorSummary-De2PTQoD.js} +3 -3
- package/build/server/chunks/doctorSummary-De2PTQoD.js.map +1 -0
- package/build/server/chunks/{error.svelte-DWPum81Y.js → error.svelte-CcYVAQ1W.js} +3 -5
- package/build/server/chunks/error.svelte-CcYVAQ1W.js.map +1 -0
- package/build/server/chunks/handler-Hnwc-LvR.js +1473 -0
- package/build/server/chunks/handler-Hnwc-LvR.js.map +1 -0
- package/build/server/chunks/{hooks.server-Dva4z7fv.js → hooks.server-CB4nMIz1.js} +4 -5
- package/build/server/chunks/hooks.server-CB4nMIz1.js.map +1 -0
- package/build/server/chunks/index.js-BISNf3Ne.js +11542 -0
- package/build/server/chunks/index.js-BISNf3Ne.js.map +1 -0
- package/build/server/{manifest.js → chunks/manifest.js-C1tyaqvp.js} +26 -30
- package/build/server/chunks/manifest.js-C1tyaqvp.js.map +1 -0
- package/build/server/chunks/{marketingSeo-DqH0vHQa.js → marketingSeo-D0c8diM4.js} +2 -2
- package/build/server/chunks/marketingSeo-D0c8diM4.js.map +1 -0
- package/build/server/chunks/{migrationReport-f6NoxAVZ.js → migrationReport-BfHleN7g.js} +2 -2
- package/build/server/chunks/migrationReport-BfHleN7g.js.map +1 -0
- package/build/server/chunks/{profileApiHelpers-DCoI7zMU.js → profileApiHelpers-CKY0z-TD.js} +2 -2
- package/build/server/chunks/profileApiHelpers-CKY0z-TD.js.map +1 -0
- package/build/server/chunks/{projectContext-B1D-bieW.js → projectContext-BtPm3MFR.js} +1098 -53
- package/build/server/chunks/projectContext-BtPm3MFR.js.map +1 -0
- package/build/server/chunks/{src2-BtraGDB1.js → src2-DwXcz8UE.js} +2 -2
- package/build/server/chunks/src2-DwXcz8UE.js.map +1 -0
- package/build/server/chunks/{src3-BXch_OaJ.js → src3-DeQh3O0_.js} +379 -6
- package/build/server/chunks/src3-DeQh3O0_.js.map +1 -0
- package/build/server/chunks/tokenStore-CTHhmHsk.js.map +1 -1
- package/build/shims.js +1 -0
- package/build/shims.js.map +1 -0
- package/package.json +6 -6
- package/build/client/_app/immutable/chunks/BcMnim1Z.js.br +0 -0
- package/build/client/_app/immutable/chunks/BcMnim1Z.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BqIBYAbW.js +0 -3
- package/build/client/_app/immutable/chunks/BqIBYAbW.js.br +0 -0
- package/build/client/_app/immutable/chunks/BqIBYAbW.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CC808Z2X.js +0 -1
- package/build/client/_app/immutable/chunks/CC808Z2X.js.br +0 -2
- package/build/client/_app/immutable/chunks/CC808Z2X.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D5fBh0I2.js.br +0 -2
- package/build/client/_app/immutable/chunks/D5fBh0I2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DJ5W1vn7.js +0 -3
- package/build/client/_app/immutable/chunks/DJ5W1vn7.js.br +0 -0
- package/build/client/_app/immutable/chunks/DJ5W1vn7.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DTBN031P.js.br +0 -2
- package/build/client/_app/immutable/chunks/DTBN031P.js.gz +0 -0
- package/build/client/_app/immutable/chunks/O6-aNYLC.js +0 -1
- package/build/client/_app/immutable/chunks/O6-aNYLC.js.br +0 -0
- package/build/client/_app/immutable/chunks/O6-aNYLC.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.Drm5SkSR.js +0 -2
- package/build/client/_app/immutable/entry/app.Drm5SkSR.js.br +0 -0
- package/build/client/_app/immutable/entry/app.Drm5SkSR.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.BbRC1ryX.js +0 -1
- package/build/client/_app/immutable/entry/start.BbRC1ryX.js.br +0 -0
- package/build/client/_app/immutable/entry/start.BbRC1ryX.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.BP1kFxFY.js +0 -1
- package/build/client/_app/immutable/nodes/0.BP1kFxFY.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.BP1kFxFY.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.CSvicVYN.js +0 -1
- package/build/client/_app/immutable/nodes/1.CSvicVYN.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.CSvicVYN.js.gz +0 -0
- package/build/client/_app/immutable/nodes/10.LJrHMplF.js +0 -3
- package/build/client/_app/immutable/nodes/10.LJrHMplF.js.br +0 -0
- package/build/client/_app/immutable/nodes/10.LJrHMplF.js.gz +0 -0
- package/build/client/_app/immutable/nodes/11.3lkgWYOd.js.br +0 -0
- package/build/client/_app/immutable/nodes/11.3lkgWYOd.js.gz +0 -0
- package/build/client/_app/immutable/nodes/12.p6ol8gkx.js.br +0 -0
- package/build/client/_app/immutable/nodes/12.p6ol8gkx.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.Clary1Ks.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.Clary1Ks.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.BBvN4Erf.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.BBvN4Erf.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.3VL8fZOS.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.3VL8fZOS.js.gz +0 -0
- package/build/client/_app/immutable/nodes/5.CiNtblYV.js +0 -2
- package/build/client/_app/immutable/nodes/5.CiNtblYV.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.CiNtblYV.js.gz +0 -0
- package/build/client/_app/immutable/nodes/6.BRCCYakl.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.BRCCYakl.js.gz +0 -0
- package/build/client/_app/immutable/nodes/7._DA-s9Iz.js.br +0 -0
- package/build/client/_app/immutable/nodes/7._DA-s9Iz.js.gz +0 -0
- package/build/client/_app/immutable/nodes/8.D0vCT-mT.js +0 -1
- package/build/client/_app/immutable/nodes/8.D0vCT-mT.js.br +0 -2
- package/build/client/_app/immutable/nodes/8.D0vCT-mT.js.gz +0 -0
- package/build/client/_app/immutable/nodes/9.DTFYsfKM.js +0 -9
- package/build/client/_app/immutable/nodes/9.DTFYsfKM.js.br +0 -0
- package/build/client/_app/immutable/nodes/9.DTFYsfKM.js.gz +0 -0
- package/build/server/chunks/0--J8MXU0r.js.map +0 -1
- package/build/server/chunks/1-BImzM_Nb.js +0 -9
- package/build/server/chunks/1-BImzM_Nb.js.map +0 -1
- package/build/server/chunks/10-CX1ex2mH.js.map +0 -1
- package/build/server/chunks/11-mzYblRmm.js +0 -9
- package/build/server/chunks/11-mzYblRmm.js.map +0 -1
- package/build/server/chunks/12-Dw1Y6Xen.js.map +0 -1
- package/build/server/chunks/2-iIDfIUc5.js.map +0 -1
- package/build/server/chunks/3-DjAsck26.js +0 -9
- package/build/server/chunks/3-DjAsck26.js.map +0 -1
- package/build/server/chunks/4-CKQYCTZo.js.map +0 -1
- package/build/server/chunks/5-BDp1sX0Q.js +0 -9
- package/build/server/chunks/5-BDp1sX0Q.js.map +0 -1
- package/build/server/chunks/6-CUIuzy6O.js +0 -9
- package/build/server/chunks/6-CUIuzy6O.js.map +0 -1
- package/build/server/chunks/7-DT_D0EX1.js.map +0 -1
- package/build/server/chunks/8-DK1BCf-b.js +0 -9
- package/build/server/chunks/8-DK1BCf-b.js.map +0 -1
- package/build/server/chunks/9-BVttRALh.js.map +0 -1
- package/build/server/chunks/Badge-DCQxSQCS.js.map +0 -1
- package/build/server/chunks/SafetyBadge-BxEGojgX.js.map +0 -1
- package/build/server/chunks/_page.svelte-1wUrXGW-.js.map +0 -1
- package/build/server/chunks/_page.svelte-B1i4IP2u.js.map +0 -1
- package/build/server/chunks/_page.svelte-B3CasgD8.js.map +0 -1
- package/build/server/chunks/_page.svelte-B8jThscg.js.map +0 -1
- package/build/server/chunks/_page.svelte-BikYFdJv.js.map +0 -1
- package/build/server/chunks/_page.svelte-D8ffqrO3.js.map +0 -1
- package/build/server/chunks/_page.svelte-D9DhnmQr.js.map +0 -1
- package/build/server/chunks/_page.svelte-NwgcXZfI.js.map +0 -1
- package/build/server/chunks/_page.svelte-qnfxKUje.js.map +0 -1
- package/build/server/chunks/_page.svelte-wL3fdD1l.js.map +0 -1
- package/build/server/chunks/_page.svelte-xTZOj1o8.js.map +0 -1
- package/build/server/chunks/_server.ts-BBDD0W6t.js.map +0 -1
- package/build/server/chunks/_server.ts-BkOJmVFg.js.map +0 -1
- package/build/server/chunks/_server.ts-C2WpZqPW.js.map +0 -1
- package/build/server/chunks/_server.ts-C49ZrV0a.js.map +0 -1
- package/build/server/chunks/_server.ts-CaVH9FSD.js.map +0 -1
- package/build/server/chunks/_server.ts-D7iLlRbM.js.map +0 -1
- package/build/server/chunks/_server.ts-DPqZOGG_.js.map +0 -1
- package/build/server/chunks/_server.ts-Dwe99x74.js.map +0 -1
- package/build/server/chunks/_server.ts-Dz9oKgWc.js.map +0 -1
- package/build/server/chunks/_server.ts-rJ_Ubi9D.js.map +0 -1
- package/build/server/chunks/client-BagBHERz.js +0 -23
- package/build/server/chunks/client-BagBHERz.js.map +0 -1
- package/build/server/chunks/dev-BdIdjvaY.js +0 -4692
- package/build/server/chunks/dev-BdIdjvaY.js.map +0 -1
- package/build/server/chunks/doctorSummary-BOtGdd9z.js.map +0 -1
- package/build/server/chunks/error.svelte-DWPum81Y.js.map +0 -1
- package/build/server/chunks/hooks.server-Dva4z7fv.js.map +0 -1
- package/build/server/chunks/index-CLnuRv4X.js +0 -134
- package/build/server/chunks/index-CLnuRv4X.js.map +0 -1
- package/build/server/chunks/index-DBqjc0Yf.js +0 -77
- package/build/server/chunks/index-DBqjc0Yf.js.map +0 -1
- package/build/server/chunks/internal-sR_8mnoa.js +0 -1998
- package/build/server/chunks/internal-sR_8mnoa.js.map +0 -1
- package/build/server/chunks/marketingSeo-DqH0vHQa.js.map +0 -1
- package/build/server/chunks/migrationReport-f6NoxAVZ.js.map +0 -1
- package/build/server/chunks/profileApiHelpers-DCoI7zMU.js.map +0 -1
- package/build/server/chunks/projectContext-B1D-bieW.js.map +0 -1
- package/build/server/chunks/src2-BtraGDB1.js.map +0 -1
- package/build/server/chunks/src3-BXch_OaJ.js.map +0 -1
- package/build/server/index.js +0 -4593
- package/build/server/index.js.map +0 -1
- package/build/server/manifest.js.map +0 -1
- /package/build/client/_app/immutable/chunks/{CP97kCR3.js → xihTtKlq.js} +0 -0
- /package/build/client/_app/immutable/chunks/{CP97kCR3.js.br → xihTtKlq.js.br} +0 -0
- /package/build/client/_app/immutable/chunks/{CP97kCR3.js.gz → xihTtKlq.js.gz} +0 -0
|
@@ -16226,17 +16226,40 @@ var ai_profile_schema_default = {
|
|
|
16226
16226
|
"codeReview": { "type": "boolean" },
|
|
16227
16227
|
"refactoring": { "type": "boolean" },
|
|
16228
16228
|
"documentation": { "type": "boolean" },
|
|
16229
|
+
"memoryGuidance": { "type": "boolean" },
|
|
16230
|
+
"loggingGuidance": { "type": "boolean" },
|
|
16229
16231
|
"subagentDrivenDevelopment": { "type": "boolean" }
|
|
16230
16232
|
}
|
|
16231
16233
|
},
|
|
16232
16234
|
"capabilities": {
|
|
16233
16235
|
"type": "object",
|
|
16234
16236
|
"additionalProperties": false,
|
|
16235
|
-
"properties": {
|
|
16236
|
-
"
|
|
16237
|
-
|
|
16238
|
-
|
|
16239
|
-
|
|
16237
|
+
"properties": {
|
|
16238
|
+
"skills": {
|
|
16239
|
+
"type": "object",
|
|
16240
|
+
"additionalProperties": false,
|
|
16241
|
+
"properties": { "packs": {
|
|
16242
|
+
"type": "array",
|
|
16243
|
+
"uniqueItems": true,
|
|
16244
|
+
"items": {
|
|
16245
|
+
"type": "string",
|
|
16246
|
+
"enum": [
|
|
16247
|
+
"base",
|
|
16248
|
+
"review",
|
|
16249
|
+
"advanced-review",
|
|
16250
|
+
"automation",
|
|
16251
|
+
"mcp-recommendations"
|
|
16252
|
+
]
|
|
16253
|
+
}
|
|
16254
|
+
} }
|
|
16255
|
+
},
|
|
16256
|
+
"delegation": {
|
|
16257
|
+
"type": "object",
|
|
16258
|
+
"additionalProperties": false,
|
|
16259
|
+
"properties": { "subagents": { "$ref": "#/definitions/subagents" } }
|
|
16260
|
+
},
|
|
16261
|
+
"hooks": { "$ref": "#/definitions/hooks" }
|
|
16262
|
+
}
|
|
16240
16263
|
},
|
|
16241
16264
|
"permissions": {
|
|
16242
16265
|
"type": "object",
|
|
@@ -16324,6 +16347,34 @@ var ai_profile_schema_default = {
|
|
|
16324
16347
|
"uniqueItems": true,
|
|
16325
16348
|
"items": { "$ref": "#/definitions/slug" }
|
|
16326
16349
|
},
|
|
16350
|
+
"hooks": {
|
|
16351
|
+
"type": "object",
|
|
16352
|
+
"additionalProperties": false,
|
|
16353
|
+
"required": ["enabled"],
|
|
16354
|
+
"properties": {
|
|
16355
|
+
"enabled": { "type": "boolean" },
|
|
16356
|
+
"advisory": {
|
|
16357
|
+
"type": "array",
|
|
16358
|
+
"uniqueItems": true,
|
|
16359
|
+
"items": {
|
|
16360
|
+
"type": "string",
|
|
16361
|
+
"enum": [
|
|
16362
|
+
"final-review-reminder",
|
|
16363
|
+
"context-injection",
|
|
16364
|
+
"pre-compact-checkpoint"
|
|
16365
|
+
]
|
|
16366
|
+
}
|
|
16367
|
+
}
|
|
16368
|
+
},
|
|
16369
|
+
"if": {
|
|
16370
|
+
"properties": { "enabled": { "const": false } },
|
|
16371
|
+
"required": ["enabled"]
|
|
16372
|
+
},
|
|
16373
|
+
"then": { "properties": { "advisory": {
|
|
16374
|
+
"type": "array",
|
|
16375
|
+
"maxItems": 0
|
|
16376
|
+
} } }
|
|
16377
|
+
},
|
|
16327
16378
|
"subagents": {
|
|
16328
16379
|
"type": "object",
|
|
16329
16380
|
"additionalProperties": false,
|
|
@@ -16347,20 +16398,37 @@ var ai_profile_schema_default = {
|
|
|
16347
16398
|
"agents": {
|
|
16348
16399
|
"type": "array",
|
|
16349
16400
|
"items": { "$ref": "#/definitions/subagent" }
|
|
16401
|
+
},
|
|
16402
|
+
"packs": {
|
|
16403
|
+
"type": "array",
|
|
16404
|
+
"uniqueItems": true,
|
|
16405
|
+
"items": {
|
|
16406
|
+
"type": "string",
|
|
16407
|
+
"enum": ["reviewer-subagents"]
|
|
16408
|
+
}
|
|
16350
16409
|
}
|
|
16351
16410
|
},
|
|
16352
16411
|
"if": {
|
|
16353
16412
|
"properties": { "enabled": { "const": true } },
|
|
16354
16413
|
"required": ["enabled"]
|
|
16355
16414
|
},
|
|
16356
|
-
"then": {
|
|
16415
|
+
"then": { "anyOf": [{
|
|
16357
16416
|
"required": ["agents"],
|
|
16358
16417
|
"properties": { "agents": {
|
|
16359
16418
|
"type": "array",
|
|
16360
|
-
"minItems": 1
|
|
16361
|
-
"items": { "$ref": "#/definitions/subagent" }
|
|
16419
|
+
"minItems": 1
|
|
16362
16420
|
} }
|
|
16363
|
-
}
|
|
16421
|
+
}, {
|
|
16422
|
+
"required": ["packs"],
|
|
16423
|
+
"properties": { "packs": {
|
|
16424
|
+
"type": "array",
|
|
16425
|
+
"minItems": 1
|
|
16426
|
+
} }
|
|
16427
|
+
}] },
|
|
16428
|
+
"else": { "properties": { "packs": {
|
|
16429
|
+
"type": "array",
|
|
16430
|
+
"maxItems": 0
|
|
16431
|
+
} } }
|
|
16364
16432
|
},
|
|
16365
16433
|
"subagent": { "oneOf": [{ "$ref": "#/definitions/subagentTemplateRef" }, { "$ref": "#/definitions/subagentInline" }] },
|
|
16366
16434
|
"subagentTemplateRef": {
|
|
@@ -16449,12 +16517,75 @@ var ai_profile_schema_default = {
|
|
|
16449
16517
|
}
|
|
16450
16518
|
};
|
|
16451
16519
|
//#endregion
|
|
16520
|
+
//#region ../../packages/core/src/reviewer-definitions.ts
|
|
16521
|
+
var REVIEWER_DEFINITIONS = [
|
|
16522
|
+
{
|
|
16523
|
+
skillId: "security-review",
|
|
16524
|
+
reviewerId: "security-reviewer",
|
|
16525
|
+
title: "Security Review",
|
|
16526
|
+
description: "Review exploit paths, secret exposure, unsafe permissions, injection, authentication and authorization, supply-chain risk, and data leakage.",
|
|
16527
|
+
focus: [
|
|
16528
|
+
"Exploit paths and trust-boundary violations.",
|
|
16529
|
+
"Secret exposure, unsafe permissions, and data leakage.",
|
|
16530
|
+
"Injection and authentication or authorization failures.",
|
|
16531
|
+
"Supply-chain and dependency risk introduced by the change."
|
|
16532
|
+
]
|
|
16533
|
+
},
|
|
16534
|
+
{
|
|
16535
|
+
skillId: "readability-review",
|
|
16536
|
+
reviewerId: "readability-reviewer",
|
|
16537
|
+
title: "Readability Review",
|
|
16538
|
+
description: "Review naming, decomposition, control flow, duplication, comments, error-handling clarity, and unnecessary abstraction.",
|
|
16539
|
+
focus: [
|
|
16540
|
+
"Names that communicate intent and domain meaning.",
|
|
16541
|
+
"Decomposition, control flow, and error-handling clarity.",
|
|
16542
|
+
"Duplication and comments that obscure rather than explain.",
|
|
16543
|
+
"Unnecessary abstraction or indirection."
|
|
16544
|
+
]
|
|
16545
|
+
},
|
|
16546
|
+
{
|
|
16547
|
+
skillId: "test-review",
|
|
16548
|
+
reviewerId: "test-reviewer",
|
|
16549
|
+
title: "Test Review",
|
|
16550
|
+
description: "Review missing cases, regression coverage, flaky patterns, fixture quality, edge cases, and behavior-versus-implementation testing.",
|
|
16551
|
+
focus: [
|
|
16552
|
+
"Missing regression and edge-case coverage.",
|
|
16553
|
+
"Flaky patterns and weak fixture quality.",
|
|
16554
|
+
"Assertions on observable behavior rather than implementation details.",
|
|
16555
|
+
"Negative paths, validation order, and failure contracts."
|
|
16556
|
+
]
|
|
16557
|
+
},
|
|
16558
|
+
{
|
|
16559
|
+
skillId: "architecture-review",
|
|
16560
|
+
reviewerId: "architecture-reviewer",
|
|
16561
|
+
title: "Architecture Review",
|
|
16562
|
+
description: "Review module boundaries, dependency direction, contracts, migration risk, and fit to the product architecture.",
|
|
16563
|
+
focus: [
|
|
16564
|
+
"Module boundaries and dependency direction.",
|
|
16565
|
+
"Public contracts and compatibility impact.",
|
|
16566
|
+
"Migration, rollout, and generated-artifact risk.",
|
|
16567
|
+
"Fit with the documented product architecture."
|
|
16568
|
+
]
|
|
16569
|
+
}
|
|
16570
|
+
];
|
|
16571
|
+
//#endregion
|
|
16452
16572
|
//#region ../../packages/core/src/profile.ts
|
|
16453
16573
|
var SUBAGENT_TEMPLATE_NAMES = [
|
|
16454
16574
|
"implementer",
|
|
16455
16575
|
"spec-reviewer",
|
|
16456
16576
|
"code-quality-reviewer"
|
|
16457
16577
|
];
|
|
16578
|
+
var ADVISORY_HOOK_ROLE_IDS = [
|
|
16579
|
+
"final-review-reminder",
|
|
16580
|
+
"context-injection",
|
|
16581
|
+
"pre-compact-checkpoint"
|
|
16582
|
+
];
|
|
16583
|
+
function getSelectedAdvisoryHookRoles(profile) {
|
|
16584
|
+
const block = profile.capabilities?.hooks;
|
|
16585
|
+
if (!block || block.enabled !== true) return [];
|
|
16586
|
+
const selected = new Set(block.advisory ?? []);
|
|
16587
|
+
return ADVISORY_HOOK_ROLE_IDS.filter((role) => selected.has(role));
|
|
16588
|
+
}
|
|
16458
16589
|
function isSubagentTemplateRef(entry) {
|
|
16459
16590
|
return typeof entry.useTemplate === "string";
|
|
16460
16591
|
}
|
|
@@ -16615,9 +16746,21 @@ function getSubagentDefaults(profile) {
|
|
|
16615
16746
|
function getEnabledSubagents(profile) {
|
|
16616
16747
|
const block = profile.capabilities?.delegation?.subagents;
|
|
16617
16748
|
if (!block || block.enabled !== true) return [];
|
|
16618
|
-
|
|
16749
|
+
const agents = (block.agents ?? []).map((entry) => expandSubagentEntry(entry));
|
|
16750
|
+
if (block.packs?.includes("reviewer-subagents")) agents.push(...REVIEWER_DEFINITIONS.map((definition) => ({
|
|
16751
|
+
name: definition.reviewerId,
|
|
16752
|
+
description: definition.description,
|
|
16753
|
+
purpose: `Perform a focused ${definition.title.toLowerCase()} of the requested change.`,
|
|
16754
|
+
prompt: `Review the requested change as a ${definition.title.toLowerCase()} specialist.\n\nFocus on:\n${definition.focus.map((item) => `- ${item}`).join("\n")}\n\nDo not edit files, run commands, install dependencies, read secrets, contact production systems, or upload source.\n\nReport exactly:\n- Status: CLEAR | FINDINGS | NEEDS_CONTEXT\n- Findings grouped by severity with evidence and affected path or contract\n- Missing evidence or context\n- Recommendation`,
|
|
16755
|
+
toolScope: "read-only",
|
|
16756
|
+
modelPreference: "capable",
|
|
16757
|
+
maxTurns: 10,
|
|
16758
|
+
timeoutMinutes: 8,
|
|
16759
|
+
mcpServers: []
|
|
16760
|
+
})));
|
|
16761
|
+
return agents;
|
|
16619
16762
|
}
|
|
16620
|
-
var SUBAGENT_BUILTIN_NAMES_NORMALIZED = new Set([
|
|
16763
|
+
var SUBAGENT_BUILTIN_NAMES_NORMALIZED = /* @__PURE__ */ new Set([
|
|
16621
16764
|
"default",
|
|
16622
16765
|
"worker",
|
|
16623
16766
|
"explorer",
|
|
@@ -16739,8 +16882,16 @@ function validateSubagentSemantics(profile) {
|
|
|
16739
16882
|
const issues = [];
|
|
16740
16883
|
const seenRaw = /* @__PURE__ */ new Map();
|
|
16741
16884
|
const seenNormalized = /* @__PURE__ */ new Map();
|
|
16885
|
+
const packNames = subagents.packs?.includes("reviewer-subagents") ? new Set(REVIEWER_DEFINITIONS.map((definition) => normalizeSubagentName(definition.reviewerId))) : /* @__PURE__ */ new Set();
|
|
16742
16886
|
entries.forEach((entry, index) => {
|
|
16743
16887
|
const name = expandSubagentEntry(entry).name;
|
|
16888
|
+
if (packNames.has(normalizeSubagentName(name))) issues.push({
|
|
16889
|
+
code: "schema_validation_error",
|
|
16890
|
+
path: `/capabilities/delegation/subagents/agents/${index}/name`,
|
|
16891
|
+
expected: "name distinct from expanded subagent packs",
|
|
16892
|
+
actual: "collision with reviewer-subagents",
|
|
16893
|
+
message: `/capabilities/delegation/subagents/agents/${index}/name collides with a subagent generated by the reviewer-subagents pack.`
|
|
16894
|
+
});
|
|
16744
16895
|
const rawIndex = seenRaw.get(name);
|
|
16745
16896
|
if (rawIndex !== void 0) issues.push({
|
|
16746
16897
|
code: "schema_validation_error",
|
|
@@ -16811,6 +16962,8 @@ function renderProfileYaml(profile) {
|
|
|
16811
16962
|
if (profile.workflow.codeReview !== void 0) workflow["codeReview"] = profile.workflow.codeReview;
|
|
16812
16963
|
if (profile.workflow.refactoring !== void 0) workflow["refactoring"] = profile.workflow.refactoring;
|
|
16813
16964
|
if (profile.workflow.documentation !== void 0) workflow["documentation"] = profile.workflow.documentation;
|
|
16965
|
+
if (profile.workflow.memoryGuidance !== void 0) workflow["memoryGuidance"] = profile.workflow.memoryGuidance;
|
|
16966
|
+
if (profile.workflow.loggingGuidance !== void 0) workflow["loggingGuidance"] = profile.workflow.loggingGuidance;
|
|
16814
16967
|
if (profile.workflow.subagentDrivenDevelopment !== void 0) workflow["subagentDrivenDevelopment"] = profile.workflow.subagentDrivenDevelopment;
|
|
16815
16968
|
doc["workflow"] = workflow;
|
|
16816
16969
|
if (profile.capabilities !== void 0) doc["capabilities"] = buildCapabilitiesDoc(profile.capabilities);
|
|
@@ -16823,6 +16976,11 @@ function renderProfileYaml(profile) {
|
|
|
16823
16976
|
}
|
|
16824
16977
|
function buildCapabilitiesDoc(capabilities) {
|
|
16825
16978
|
const doc = {};
|
|
16979
|
+
if (capabilities.skills !== void 0) {
|
|
16980
|
+
const skills = {};
|
|
16981
|
+
if (capabilities.skills.packs !== void 0) skills["packs"] = capabilities.skills.packs;
|
|
16982
|
+
doc["skills"] = skills;
|
|
16983
|
+
}
|
|
16826
16984
|
if (capabilities.delegation !== void 0) {
|
|
16827
16985
|
const delegation = {};
|
|
16828
16986
|
const subagents = capabilities.delegation.subagents;
|
|
@@ -16835,10 +16993,16 @@ function buildCapabilitiesDoc(capabilities) {
|
|
|
16835
16993
|
if (Object.keys(defaults).length > 0) block["defaults"] = defaults;
|
|
16836
16994
|
}
|
|
16837
16995
|
if (subagents.agents !== void 0) block["agents"] = subagents.agents.map((entry) => isSubagentTemplateRef(entry) ? { useTemplate: entry.useTemplate } : buildSubagentDoc(entry));
|
|
16996
|
+
if (subagents.packs !== void 0) block["packs"] = subagents.packs;
|
|
16838
16997
|
delegation["subagents"] = block;
|
|
16839
16998
|
}
|
|
16840
16999
|
if (Object.keys(delegation).length > 0) doc["delegation"] = delegation;
|
|
16841
17000
|
}
|
|
17001
|
+
if (capabilities.hooks !== void 0) {
|
|
17002
|
+
const hooks = { enabled: capabilities.hooks.enabled };
|
|
17003
|
+
if (capabilities.hooks.advisory !== void 0) hooks["advisory"] = capabilities.hooks.advisory;
|
|
17004
|
+
doc["hooks"] = hooks;
|
|
17005
|
+
}
|
|
16842
17006
|
return doc;
|
|
16843
17007
|
}
|
|
16844
17008
|
function buildSubagentDoc(agent) {
|
|
@@ -17050,6 +17214,7 @@ function getDefaultTargetIds() {
|
|
|
17050
17214
|
"tabnine-mcp-config",
|
|
17051
17215
|
"tabnine-subagents",
|
|
17052
17216
|
"codex-config",
|
|
17217
|
+
"codex-hooks",
|
|
17053
17218
|
"codex-workflow-skills",
|
|
17054
17219
|
"codex-subagents",
|
|
17055
17220
|
"claude-settings",
|
|
@@ -17091,7 +17256,7 @@ function compareText(left, right) {
|
|
|
17091
17256
|
}
|
|
17092
17257
|
//#endregion
|
|
17093
17258
|
//#region ../../packages/compiler/src/lockfile.ts
|
|
17094
|
-
var SUPPORTED_VERSIONS = new Set([1, 2]);
|
|
17259
|
+
var SUPPORTED_VERSIONS = /* @__PURE__ */ new Set([1, 2]);
|
|
17095
17260
|
function buildLockfile(input) {
|
|
17096
17261
|
const profilePath = safeOutputPath(input.profilePath ?? "ai-profile.yaml");
|
|
17097
17262
|
const mixedByPath = new Map((input.mixedOutputs ?? []).map((entry) => [safeOutputPath(entry.path), entry]));
|
|
@@ -17959,6 +18124,73 @@ var DOCUMENTATION_TOPIC = {
|
|
|
17959
18124
|
tabnineChecklistReference: "See `90-final-review.md` for the shared final-review checklist.",
|
|
17960
18125
|
agentsMdChecklistReference: "See the `## Completion Checklist` section for shared review steps."
|
|
17961
18126
|
};
|
|
18127
|
+
var MEMORY_GUIDANCE_TOPIC = {
|
|
18128
|
+
tabnineTitle: "Memory Guidance",
|
|
18129
|
+
agentsMdTitle: "Memory Guidance",
|
|
18130
|
+
intro: "Use these rules to decide what belongs in agent memory and where each enabled client persists it.",
|
|
18131
|
+
subsections: [
|
|
18132
|
+
{
|
|
18133
|
+
heading: "Where Memory Lives",
|
|
18134
|
+
bullets: [
|
|
18135
|
+
"Claude Code keeps durable project instructions in `CLAUDE.md` and its auto-memory surface.",
|
|
18136
|
+
"Codex keeps durable project instructions in `AGENTS.md` and its Memories surface.",
|
|
18137
|
+
"Tabnine uses project guidelines for durable instructions; no project-local memory contract is verified, so treat Tabnine memory as unverified rather than assumed.",
|
|
18138
|
+
"Precedence between these surfaces is target-specific; do not assume one client's ordering applies to another."
|
|
18139
|
+
]
|
|
18140
|
+
},
|
|
18141
|
+
{
|
|
18142
|
+
heading: "Never Store In Memory",
|
|
18143
|
+
bullets: ["Never store secrets, tokens, credentials, private keys, production access, personal/customer data, or one-time debugging context in memory."]
|
|
18144
|
+
},
|
|
18145
|
+
{
|
|
18146
|
+
heading: "Keep Memory Durable",
|
|
18147
|
+
bullets: ["Store durable decisions and conventions, not session-specific or volatile state.", "Delete a wrong memory instead of adding a second memory to correct around it."]
|
|
18148
|
+
}
|
|
18149
|
+
],
|
|
18150
|
+
tabnineChecklistReference: "See `90-final-review.md` for the shared final-review checklist.",
|
|
18151
|
+
agentsMdChecklistReference: "See the `## Completion Checklist` section for shared review steps."
|
|
18152
|
+
};
|
|
18153
|
+
var LOGGING_GUIDANCE_TOPIC = {
|
|
18154
|
+
tabnineTitle: "Logging Guidance",
|
|
18155
|
+
agentsMdTitle: "Logging Guidance",
|
|
18156
|
+
intro: "Use these rules to decide what to log, how to name it, and how to keep diagnostics safe and separate from product output.",
|
|
18157
|
+
subsections: [
|
|
18158
|
+
{
|
|
18159
|
+
heading: "Debug vs Observability",
|
|
18160
|
+
bullets: [
|
|
18161
|
+
"Separate throwaway debug output from durable observability: debug prints exist only to diagnose a failure in progress.",
|
|
18162
|
+
"Remove debug output before marking work done; leftover debug prints are a defect, not a feature.",
|
|
18163
|
+
"Prefer a narrower failing test over debug prints to isolate a problem."
|
|
18164
|
+
]
|
|
18165
|
+
},
|
|
18166
|
+
{
|
|
18167
|
+
heading: "Project Convention Precedence",
|
|
18168
|
+
bullets: ["Follow the project's existing logging convention when one exists; do not invent an ad hoc format alongside it.", "When no convention exists, propose one as an ADR candidate before adopting it; never invent a convention ad hoc."]
|
|
18169
|
+
},
|
|
18170
|
+
{
|
|
18171
|
+
heading: "Stable Event Codes",
|
|
18172
|
+
bullets: ["Attach a stable event code to each new error path instead of free text.", "Keep codes stable so support and tooling can rely on them; free-text messages are not a substitute."]
|
|
18173
|
+
},
|
|
18174
|
+
{
|
|
18175
|
+
heading: "Redaction Rule",
|
|
18176
|
+
bullets: ["Never log secrets, tokens, credentials, environment variable values, user file contents, or personal or production data. Log by allowlist: only values explicitly known to be safe."]
|
|
18177
|
+
},
|
|
18178
|
+
{
|
|
18179
|
+
heading: "Channel Separation",
|
|
18180
|
+
bullets: ["Keep diagnostics on the diagnostic channel so they never contaminate machine or product output (stderr vs stdout, or the platform equivalent)."]
|
|
18181
|
+
},
|
|
18182
|
+
{
|
|
18183
|
+
heading: "Logs and Tests",
|
|
18184
|
+
bullets: ["Treat support-relied logs as observable behavior that deserves tests.", "Never assert on incidental debug logs."]
|
|
18185
|
+
},
|
|
18186
|
+
{
|
|
18187
|
+
heading: "Priority Order",
|
|
18188
|
+
bullets: ["When these rules conflict, apply them in this order: redaction > convention > codes (redaction beats project convention beats event codes)."]
|
|
18189
|
+
}
|
|
18190
|
+
],
|
|
18191
|
+
tabnineChecklistReference: "See `90-final-review.md` for the shared final-review checklist.",
|
|
18192
|
+
agentsMdChecklistReference: "See the `## Completion Checklist` section for shared review steps."
|
|
18193
|
+
};
|
|
17962
18194
|
function renderTopicAsTabnineGuideline(topic) {
|
|
17963
18195
|
const sections = topic.subsections.map((subsection) => `## ${subsection.heading}\n\n${subsection.bullets.map((bullet) => `- ${bullet}`).join("\n")}\n`).join("\n");
|
|
17964
18196
|
return `<!-- Generated by Agent Profile Compiler. Do not edit by hand. -->
|
|
@@ -17983,33 +18215,507 @@ ${topic.agentsMdChecklistReference}
|
|
|
17983
18215
|
`;
|
|
17984
18216
|
}
|
|
17985
18217
|
//#endregion
|
|
17986
|
-
//#region ../../packages/compiler/src/
|
|
17987
|
-
|
|
17988
|
-
{
|
|
17989
|
-
|
|
17990
|
-
|
|
18218
|
+
//#region ../../packages/compiler/src/phase12-skill-content.ts
|
|
18219
|
+
function renderBullets(items) {
|
|
18220
|
+
return items.map((item) => `- ${item}`).join("\n");
|
|
18221
|
+
}
|
|
18222
|
+
function renderReviewChangeSkill(selectedSkills) {
|
|
18223
|
+
const sections = CODE_REVIEW_TOPIC.subsections.map((section) => `## ${section.heading}\n\n${renderBullets(section.bullets)}`).join("\n\n");
|
|
18224
|
+
const specialists = REVIEWER_DEFINITIONS.filter((definition) => selectedSkills.has(definition.skillId));
|
|
18225
|
+
const specialistSection = specialists.length === 0 ? "" : `\n\n## Specialist Reviews\n\n${specialists.map((definition) => `- For a deeper pass, run \`${definition.skillId}\`.`).join("\n")}`;
|
|
18226
|
+
return `---
|
|
18227
|
+
name: review-change
|
|
18228
|
+
description: Use to review a proposed change for correctness, security-sensitive behavior, readability, tests, performance when relevant, architecture and contract impact, and generated-file drift.
|
|
18229
|
+
---
|
|
18230
|
+
|
|
18231
|
+
<!-- Generated by Agent Profile Compiler. Do not edit by hand. -->
|
|
18232
|
+
|
|
18233
|
+
# Review Change
|
|
18234
|
+
|
|
18235
|
+
${CODE_REVIEW_TOPIC.intro}
|
|
18236
|
+
|
|
18237
|
+
${sections}${specialistSection}
|
|
18238
|
+
|
|
18239
|
+
## Safety
|
|
18240
|
+
|
|
18241
|
+
- Review only; do not rewrite or apply patches unless the user asks.
|
|
18242
|
+
- Do not upload source code or read or print secrets.
|
|
18243
|
+
- Do not install dependencies, contact production systems, or broaden permissions.
|
|
18244
|
+
`;
|
|
18245
|
+
}
|
|
18246
|
+
function renderSpecialistSkill(definition) {
|
|
18247
|
+
return `---
|
|
18248
|
+
name: ${definition.skillId}
|
|
18249
|
+
description: ${definition.description}
|
|
18250
|
+
---
|
|
18251
|
+
|
|
18252
|
+
<!-- Generated by Agent Profile Compiler. Do not edit by hand. -->
|
|
18253
|
+
|
|
18254
|
+
# ${definition.title}
|
|
18255
|
+
|
|
18256
|
+
## Focus
|
|
18257
|
+
|
|
18258
|
+
${renderBullets(definition.focus)}
|
|
18259
|
+
|
|
18260
|
+
## Output Discipline
|
|
18261
|
+
|
|
18262
|
+
- Lead with prioritized findings and concrete evidence.
|
|
18263
|
+
- Cite the affected file, symbol, or contract when available.
|
|
18264
|
+
- Distinguish confirmed defects from risks or missing evidence.
|
|
18265
|
+
- Do not edit or rewrite the change unless the user asks.
|
|
18266
|
+
|
|
18267
|
+
## Safety
|
|
18268
|
+
|
|
18269
|
+
- Review only; do not run scanners, install tools, or broaden permissions.
|
|
18270
|
+
- Do not upload source code or read or print secrets.
|
|
18271
|
+
- Do not contact production systems or external services.
|
|
18272
|
+
`;
|
|
18273
|
+
}
|
|
18274
|
+
function renderSpecialistReviewSkill(skill) {
|
|
18275
|
+
const definition = REVIEWER_DEFINITIONS.find((candidate) => candidate.skillId === skill);
|
|
18276
|
+
return definition === void 0 ? void 0 : renderSpecialistSkill(definition);
|
|
18277
|
+
}
|
|
18278
|
+
function renderMcpFitCheckSkill() {
|
|
18279
|
+
return `---
|
|
18280
|
+
name: mcp-fit-check
|
|
18281
|
+
description: Use to assess whether current documentation through an MCP, docs, or search integration may help with a dependency that may be newer than the client's knowledge.
|
|
18282
|
+
---
|
|
18283
|
+
|
|
18284
|
+
<!-- Generated by Agent Profile Compiler. Do not edit by hand. -->
|
|
18285
|
+
|
|
18286
|
+
# MCP Fit Check
|
|
18287
|
+
|
|
18288
|
+
## Assessment
|
|
18289
|
+
|
|
18290
|
+
1. Identify the dependency, framework, runtime, or SDK whose current behavior matters.
|
|
18291
|
+
2. Explain why it may be newer than the client's knowledge; never claim the model definitely lacks that knowledge.
|
|
18292
|
+
3. Recommend only the type of current documentation integration that may help and explain its risk.
|
|
18293
|
+
4. Keep the result informational and defer every install or configuration decision to the user.
|
|
18294
|
+
|
|
18295
|
+
## Boundaries
|
|
18296
|
+
|
|
18297
|
+
- Never install or configure an MCP server, documentation connector, or search integration.
|
|
18298
|
+
- Do not generate MCP configuration, server commands, install commands, environment variable names, tokens, or arbitrary MCP ids.
|
|
18299
|
+
- Do not make network calls, execute commands, or change files.
|
|
18300
|
+
- Do not read or print secrets.
|
|
18301
|
+
|
|
18302
|
+
## Output
|
|
18303
|
+
|
|
18304
|
+
Report the dependency, why current docs may help, the recommended integration category, its risk, and the explicit next decision for the user.
|
|
18305
|
+
`;
|
|
18306
|
+
}
|
|
18307
|
+
//#endregion
|
|
18308
|
+
//#region ../../packages/compiler/src/skill-selection.ts
|
|
18309
|
+
var SKILL_ORDER = [
|
|
18310
|
+
"grill-change",
|
|
18311
|
+
"request-to-spec-issues",
|
|
18312
|
+
"sdd-change",
|
|
18313
|
+
"tdd-change",
|
|
18314
|
+
"final-review",
|
|
18315
|
+
"subagent-driven-change",
|
|
18316
|
+
"implement-next",
|
|
18317
|
+
"review-change",
|
|
18318
|
+
"security-review",
|
|
18319
|
+
"readability-review",
|
|
18320
|
+
"test-review",
|
|
18321
|
+
"architecture-review",
|
|
18322
|
+
"loop-implement-test-fix",
|
|
18323
|
+
"loop-review-patch-retest",
|
|
18324
|
+
"loop-security-patch-retest",
|
|
18325
|
+
"loop-docs-update",
|
|
18326
|
+
"loop-sdd-cycle",
|
|
18327
|
+
"mcp-fit-check"
|
|
18328
|
+
];
|
|
18329
|
+
var LOOP_SKILL_IDS = [
|
|
18330
|
+
"loop-implement-test-fix",
|
|
18331
|
+
"loop-review-patch-retest",
|
|
18332
|
+
"loop-security-patch-retest",
|
|
18333
|
+
"loop-docs-update",
|
|
18334
|
+
"loop-sdd-cycle"
|
|
18335
|
+
];
|
|
18336
|
+
function isLoopSkillId(skill) {
|
|
18337
|
+
return LOOP_SKILL_IDS.includes(skill);
|
|
18338
|
+
}
|
|
18339
|
+
var MODEL_INVOCATION_ENTRY_POINTS = [
|
|
18340
|
+
"grill-change",
|
|
18341
|
+
"request-to-spec-issues",
|
|
18342
|
+
"implement-next",
|
|
18343
|
+
...LOOP_SKILL_IDS
|
|
18344
|
+
];
|
|
18345
|
+
var DISABLE_MODEL_INVOCATION_TARGETS = ["claude-workflow-skills"];
|
|
18346
|
+
function isModelInvocationEntryPoint(skill) {
|
|
18347
|
+
return MODEL_INVOCATION_ENTRY_POINTS.includes(skill);
|
|
18348
|
+
}
|
|
18349
|
+
/**
|
|
18350
|
+
* The closed policy function: emit `disable-model-invocation: true` iff the
|
|
18351
|
+
* skill is an entry point AND the target verifiably supports the flag.
|
|
18352
|
+
* Unverified target support means the flag is omitted (skill still emitted).
|
|
18353
|
+
*/
|
|
18354
|
+
function disablesModelInvocation(skill, target) {
|
|
18355
|
+
return isModelInvocationEntryPoint(skill) && DISABLE_MODEL_INVOCATION_TARGETS.includes(target);
|
|
18356
|
+
}
|
|
18357
|
+
var PACK_SKILLS = {
|
|
18358
|
+
base: [
|
|
18359
|
+
"sdd-change",
|
|
18360
|
+
"tdd-change",
|
|
18361
|
+
"final-review"
|
|
18362
|
+
],
|
|
18363
|
+
review: ["review-change"],
|
|
18364
|
+
"advanced-review": [
|
|
18365
|
+
"security-review",
|
|
18366
|
+
"readability-review",
|
|
18367
|
+
"test-review",
|
|
18368
|
+
"architecture-review"
|
|
18369
|
+
],
|
|
18370
|
+
automation: [
|
|
18371
|
+
"loop-implement-test-fix",
|
|
18372
|
+
"loop-review-patch-retest",
|
|
18373
|
+
"loop-security-patch-retest",
|
|
18374
|
+
"loop-docs-update",
|
|
18375
|
+
"loop-sdd-cycle"
|
|
18376
|
+
],
|
|
18377
|
+
"mcp-recommendations": ["mcp-fit-check"]
|
|
18378
|
+
};
|
|
18379
|
+
function resolveSkillPacks(packs) {
|
|
18380
|
+
const selected = /* @__PURE__ */ new Set();
|
|
18381
|
+
for (const pack of packs) for (const skill of PACK_SKILLS[pack]) selected.add(skill);
|
|
18382
|
+
return SKILL_ORDER.filter((skill) => selected.has(skill));
|
|
18383
|
+
}
|
|
18384
|
+
/**
|
|
18385
|
+
* Phase 24 (I4): `implement-next` dispatches one ready ledger task through the
|
|
18386
|
+
* subagent-driven cycle. It is emitted only when both prerequisites it consumes
|
|
18387
|
+
* are also emitted - `request-to-spec-issues` (from `sdd`) for the persisted
|
|
18388
|
+
* brief/ledger format, and `subagent-driven-change` (from
|
|
18389
|
+
* `subagentDrivenDevelopment`) for the implementer -> spec-reviewer ->
|
|
18390
|
+
* code-quality-reviewer chain. The workflow-skill targets (Codex and Claude)
|
|
18391
|
+
* are both `confirmed-official` for that chain; Tabnine is a missing-capability
|
|
18392
|
+
* target and gets an informational note instead (see the compiler).
|
|
18393
|
+
*/
|
|
18394
|
+
function emitsImplementNext(workflow) {
|
|
18395
|
+
return workflow.sdd === true && workflow.subagentDrivenDevelopment === true;
|
|
18396
|
+
}
|
|
18397
|
+
function resolveSkills(input) {
|
|
18398
|
+
const selected = /* @__PURE__ */ new Set();
|
|
18399
|
+
if (input.workflow.sdd) {
|
|
18400
|
+
selected.add("grill-change");
|
|
18401
|
+
selected.add("request-to-spec-issues");
|
|
18402
|
+
selected.add("sdd-change");
|
|
18403
|
+
}
|
|
18404
|
+
if (input.workflow.tdd) selected.add("tdd-change");
|
|
18405
|
+
if (input.workflow.finalReview) selected.add("final-review");
|
|
18406
|
+
if (input.workflow.subagentDrivenDevelopment === true) selected.add("subagent-driven-change");
|
|
18407
|
+
if (emitsImplementNext(input.workflow)) selected.add("implement-next");
|
|
18408
|
+
if (input.workflow.codeReview === true) selected.add("review-change");
|
|
18409
|
+
for (const skill of resolveSkillPacks(input.packs)) selected.add(skill);
|
|
18410
|
+
return SKILL_ORDER.filter((skill) => selected.has(skill));
|
|
18411
|
+
}
|
|
18412
|
+
function resolveSelectedSkills(profile) {
|
|
18413
|
+
return resolveSkills({
|
|
18414
|
+
workflow: profile.workflow,
|
|
18415
|
+
packs: profile.capabilities?.skills?.packs ?? []
|
|
18416
|
+
});
|
|
18417
|
+
}
|
|
18418
|
+
//#endregion
|
|
18419
|
+
//#region ../../packages/compiler/src/loop-skill-content.ts
|
|
18420
|
+
var MAX_ITERATIONS = 3;
|
|
18421
|
+
var LOOP_SKILL_DEFINITIONS = {
|
|
18422
|
+
"loop-implement-test-fix": {
|
|
18423
|
+
description: "Use to run a bounded implement, test, and fix loop that stops on green, on no diff, or on a repeated identical failure.",
|
|
18424
|
+
title: "Loop: Implement, Test, Fix",
|
|
18425
|
+
intro: "Drive a small implementation to green through a bounded number of iterations. Each iteration makes one focused change, runs the relevant checks, and reacts to the result.",
|
|
18426
|
+
steps: [
|
|
18427
|
+
"Implement the smallest change that moves the task toward its acceptance criteria.",
|
|
18428
|
+
{
|
|
18429
|
+
skill: "tdd-change",
|
|
18430
|
+
pointer: "Prove the change with a focused test first; run `tdd-change` for the red/green discipline.",
|
|
18431
|
+
inline: "Prove the change with a focused failing test first, then make it pass."
|
|
18432
|
+
},
|
|
18433
|
+
"Run the narrowest relevant test or check command and read the result.",
|
|
18434
|
+
"If it fails, apply one focused fix and continue to the next iteration."
|
|
18435
|
+
]
|
|
17991
18436
|
},
|
|
17992
|
-
{
|
|
17993
|
-
|
|
17994
|
-
|
|
18437
|
+
"loop-review-patch-retest": {
|
|
18438
|
+
description: "Use to run a bounded review, patch, and retest loop that stops on green, on no diff, or on a repeated identical finding.",
|
|
18439
|
+
title: "Loop: Review, Patch, Retest",
|
|
18440
|
+
intro: "Iterate on review findings for a change until the review is clean, bounded by a hard iteration cap. Each iteration reviews, patches one finding cluster, and retests.",
|
|
18441
|
+
steps: [
|
|
18442
|
+
{
|
|
18443
|
+
skill: "review-change",
|
|
18444
|
+
pointer: "Review the change for correctness and contract impact; run `review-change` for the full pass.",
|
|
18445
|
+
inline: "Review the change for correctness, tests, and contract impact."
|
|
18446
|
+
},
|
|
18447
|
+
"Patch the highest-priority findings with a focused change.",
|
|
18448
|
+
"Rerun the relevant tests and checks and confirm the finding is resolved."
|
|
18449
|
+
]
|
|
17995
18450
|
},
|
|
17996
|
-
{
|
|
17997
|
-
|
|
17998
|
-
|
|
18451
|
+
"loop-security-patch-retest": {
|
|
18452
|
+
description: "Use to run a bounded security-review, patch, and retest loop that stops on green, on no diff, or on a repeated identical finding.",
|
|
18453
|
+
title: "Loop: Security Review, Patch, Retest",
|
|
18454
|
+
intro: "Iterate on security-sensitive findings for a change until they are resolved, bounded by a hard iteration cap. Each iteration reviews for security risk, patches, and retests.",
|
|
18455
|
+
steps: [
|
|
18456
|
+
{
|
|
18457
|
+
skill: "security-review",
|
|
18458
|
+
pointer: "Review the change for security-sensitive behavior; run `security-review` for the focused pass.",
|
|
18459
|
+
inline: "Review the change for security-sensitive behavior and injection, secret-handling, and permission risks."
|
|
18460
|
+
},
|
|
18461
|
+
"Patch the highest-severity finding with a focused, minimal change.",
|
|
18462
|
+
"Rerun the relevant tests and checks and confirm the risk is resolved without regressions."
|
|
18463
|
+
]
|
|
18464
|
+
},
|
|
18465
|
+
"loop-docs-update": {
|
|
18466
|
+
description: "Use to run a bounded documentation drift scan, update, and re-verify loop that stops when docs match the code, on no diff, or on a repeated identical mismatch.",
|
|
18467
|
+
title: "Loop: Documentation Update",
|
|
18468
|
+
intro: "Bring documentation back in sync with the code through a bounded number of iterations. Each iteration scans for drift, updates one area, and re-verifies against the source.",
|
|
18469
|
+
steps: [
|
|
18470
|
+
"Scan the docs for statements that no longer match the current code or contracts.",
|
|
18471
|
+
"Update one drifted area to match the code, keeping the change focused.",
|
|
18472
|
+
"Re-verify the updated docs against the source and note any remaining drift."
|
|
18473
|
+
]
|
|
17999
18474
|
},
|
|
18475
|
+
"loop-sdd-cycle": {
|
|
18476
|
+
description: "Use to run a bounded spec, tests, implementation, and verify cycle that stops on green, on no diff, or on a repeated identical failure.",
|
|
18477
|
+
title: "Loop: SDD Cycle",
|
|
18478
|
+
intro: "Advance one approved spec slice through spec, tests, implementation, and verification in bounded iterations. Each iteration takes the smallest slice that keeps the spec and its tests in step.",
|
|
18479
|
+
steps: [
|
|
18480
|
+
{
|
|
18481
|
+
skill: "sdd-change",
|
|
18482
|
+
pointer: "Confirm the slice against the approved spec; run `sdd-change` for the spec-first discipline.",
|
|
18483
|
+
inline: "Confirm the slice against the approved spec before changing behavior."
|
|
18484
|
+
},
|
|
18485
|
+
{
|
|
18486
|
+
skill: "tdd-change",
|
|
18487
|
+
pointer: "Add or update a focused failing test for the slice; run `tdd-change` for the red/green discipline.",
|
|
18488
|
+
inline: "Add or update a focused failing test for the slice before implementing."
|
|
18489
|
+
},
|
|
18490
|
+
"Implement the smallest change that satisfies the failing test and the spec.",
|
|
18491
|
+
{
|
|
18492
|
+
skill: "final-review",
|
|
18493
|
+
pointer: "Verify the slice against the spec and acceptance criteria; run `final-review` before handoff.",
|
|
18494
|
+
inline: "Verify the slice against the spec and its acceptance criteria before handoff."
|
|
18495
|
+
}
|
|
18496
|
+
]
|
|
18497
|
+
}
|
|
18498
|
+
};
|
|
18499
|
+
function renderStep(step, index, selectedSkills) {
|
|
18500
|
+
const text = typeof step === "string" ? step : selectedSkills.has(step.skill) ? step.pointer : step.inline;
|
|
18501
|
+
return `${index + 1}. ${text}`;
|
|
18502
|
+
}
|
|
18503
|
+
function renderLoopSkill(skill, selectedSkills) {
|
|
18504
|
+
const definition = LOOP_SKILL_DEFINITIONS[skill];
|
|
18505
|
+
const steps = definition.steps.map((step, index) => renderStep(step, index, selectedSkills)).join("\n");
|
|
18506
|
+
return `---
|
|
18507
|
+
name: ${skill}
|
|
18508
|
+
description: ${definition.description}
|
|
18509
|
+
---
|
|
18510
|
+
|
|
18511
|
+
<!-- Generated by Agent Profile Compiler. Do not edit by hand. -->
|
|
18512
|
+
|
|
18513
|
+
# ${definition.title}
|
|
18514
|
+
|
|
18515
|
+
${definition.intro}
|
|
18516
|
+
|
|
18517
|
+
## Loop Steps
|
|
18518
|
+
|
|
18519
|
+
${steps}
|
|
18520
|
+
|
|
18521
|
+
## Max Iterations
|
|
18522
|
+
|
|
18523
|
+
The loop runs at most ${MAX_ITERATIONS} iterations. When it reaches ${MAX_ITERATIONS} iterations without meeting a stop condition, it stops unconditionally and reports the unfinished state and the outstanding work; it never raises the bound to keep going.
|
|
18524
|
+
|
|
18525
|
+
## Stop Conditions
|
|
18526
|
+
|
|
18527
|
+
Stop the loop as soon as any of these holds:
|
|
18528
|
+
|
|
18529
|
+
- The relevant tests and checks are green.
|
|
18530
|
+
- An iteration produces no diff.
|
|
18531
|
+
- The same failure repeats identically across two consecutive iterations.
|
|
18532
|
+
|
|
18533
|
+
## Approval Gate
|
|
18534
|
+
|
|
18535
|
+
- Get explicit human approval before any write, commit, or destructive step in each iteration.
|
|
18536
|
+
- The loop never self-approves, never continues past the iteration bound, and never runs destructive commands on its own authority.
|
|
18537
|
+
- Pause and surface the state whenever approval is missing.
|
|
18538
|
+
|
|
18539
|
+
## Safety
|
|
18540
|
+
|
|
18541
|
+
- Do not upload source code.
|
|
18542
|
+
- Do not read or print secrets.
|
|
18543
|
+
- APC does not run this loop; a human or agent follows these instructions and remains in control.
|
|
18544
|
+
`;
|
|
18545
|
+
}
|
|
18546
|
+
function renderLoopSkillContent(skill, selectedSkills = /* @__PURE__ */ new Set()) {
|
|
18547
|
+
return LOOP_SKILL_IDS.includes(skill) ? renderLoopSkill(skill, selectedSkills) : void 0;
|
|
18548
|
+
}
|
|
18549
|
+
/**
|
|
18550
|
+
* Not-supported note for the automation pack on a Tabnine-including target set
|
|
18551
|
+
* (never silence). Loop skills are skills-capable-client artifacts only;
|
|
18552
|
+
* Tabnine gets an explicit informational note, consistent with the
|
|
18553
|
+
* unsupported-target rule.
|
|
18554
|
+
*/
|
|
18555
|
+
function automationTabnineNote(path) {
|
|
18556
|
+
return {
|
|
18557
|
+
code: "automation_target_not_generated",
|
|
18558
|
+
path,
|
|
18559
|
+
expected: "skills-capable client (Claude or Codex)",
|
|
18560
|
+
actual: "Tabnine has no loop skill surface",
|
|
18561
|
+
message: "capabilities.skills.packs automation loop skills are not generated for Tabnine: loop skills target skills-capable clients (Claude and Codex) only."
|
|
18562
|
+
};
|
|
18563
|
+
}
|
|
18564
|
+
//#endregion
|
|
18565
|
+
//#region ../../packages/compiler/src/hooks.ts
|
|
18566
|
+
var VERIFIED_CLAUDE_HOOK_EVENTS = [
|
|
18567
|
+
"SessionStart",
|
|
18568
|
+
"Setup",
|
|
18569
|
+
"InstructionsLoaded",
|
|
18570
|
+
"UserPromptSubmit",
|
|
18571
|
+
"UserPromptExpansion",
|
|
18572
|
+
"MessageDisplay",
|
|
18573
|
+
"PreToolUse",
|
|
18574
|
+
"PermissionRequest",
|
|
18575
|
+
"PostToolUse",
|
|
18576
|
+
"PostToolUseFailure",
|
|
18577
|
+
"PostToolBatch",
|
|
18578
|
+
"PermissionDenied",
|
|
18579
|
+
"Notification",
|
|
18580
|
+
"SubagentStart",
|
|
18581
|
+
"SubagentStop",
|
|
18582
|
+
"TaskCreated",
|
|
18583
|
+
"TaskCompleted",
|
|
18584
|
+
"Stop",
|
|
18585
|
+
"StopFailure",
|
|
18586
|
+
"TeammateIdle",
|
|
18587
|
+
"ConfigChange",
|
|
18588
|
+
"CwdChanged",
|
|
18589
|
+
"FileChanged",
|
|
18590
|
+
"WorktreeCreate",
|
|
18591
|
+
"WorktreeRemove",
|
|
18592
|
+
"PreCompact",
|
|
18593
|
+
"PostCompact",
|
|
18594
|
+
"SessionEnd",
|
|
18595
|
+
"Elicitation",
|
|
18596
|
+
"ElicitationResult"
|
|
18597
|
+
];
|
|
18598
|
+
var VERIFIED_CODEX_HOOK_EVENTS = [
|
|
18599
|
+
"SessionStart",
|
|
18600
|
+
"UserPromptSubmit",
|
|
18601
|
+
"PreToolUse",
|
|
18602
|
+
"PermissionRequest",
|
|
18603
|
+
"PostToolUse",
|
|
18604
|
+
"SubagentStart",
|
|
18605
|
+
"SubagentStop",
|
|
18606
|
+
"Stop",
|
|
18607
|
+
"PreCompact",
|
|
18608
|
+
"PostCompact"
|
|
18609
|
+
];
|
|
18610
|
+
var TEMPLATES_BY_ROLE = new Map([
|
|
18000
18611
|
{
|
|
18001
|
-
|
|
18002
|
-
|
|
18612
|
+
role: "final-review-reminder",
|
|
18613
|
+
events: ["Stop", "SubagentStop"],
|
|
18614
|
+
claudeCommand: "echo \"Reminder: run the final-review skill before handing off.\"",
|
|
18615
|
+
codexCommand: "echo '{\"systemMessage\":\"Reminder: run the final-review skill before handing off.\"}'",
|
|
18616
|
+
codexCommandWindows: "cmd /c echo {\"systemMessage\":\"Reminder: run the final-review skill before handing off.\"}"
|
|
18003
18617
|
},
|
|
18004
18618
|
{
|
|
18005
|
-
|
|
18006
|
-
|
|
18619
|
+
role: "context-injection",
|
|
18620
|
+
events: ["UserPromptSubmit"],
|
|
18621
|
+
claudeCommand: "git status --short --branch; exit 0",
|
|
18622
|
+
codexCommand: "git status --short --branch; exit 0",
|
|
18623
|
+
codexCommandWindows: "cmd /c \"git status --short --branch || exit 0\""
|
|
18007
18624
|
},
|
|
18008
18625
|
{
|
|
18009
|
-
|
|
18010
|
-
|
|
18626
|
+
role: "pre-compact-checkpoint",
|
|
18627
|
+
events: ["PreCompact"],
|
|
18628
|
+
claudeCommand: "echo \"Reminder: checkpoint in-progress work before compaction.\"",
|
|
18629
|
+
codexCommand: "echo '{\"systemMessage\":\"Reminder: checkpoint in-progress work before compaction.\"}'",
|
|
18630
|
+
codexCommandWindows: "cmd /c echo {\"systemMessage\":\"Reminder: checkpoint in-progress work before compaction.\"}"
|
|
18631
|
+
}
|
|
18632
|
+
].map((template) => [template.role, template]));
|
|
18633
|
+
function getAdvisoryHookTemplate(role) {
|
|
18634
|
+
const template = TEMPLATES_BY_ROLE.get(role);
|
|
18635
|
+
if (!template) throw new Error(`Unknown advisory hook role ${role}.`);
|
|
18636
|
+
return template;
|
|
18637
|
+
}
|
|
18638
|
+
function getAdvisoryHookTemplateId(role) {
|
|
18639
|
+
return `targets/claude-hooks/${role}@1`;
|
|
18640
|
+
}
|
|
18641
|
+
function getCodexHookTemplateId(role) {
|
|
18642
|
+
return `targets/codex-hooks/${role}@1`;
|
|
18643
|
+
}
|
|
18644
|
+
function renderAdvisoryHookTemplateSource(role) {
|
|
18645
|
+
const template = getAdvisoryHookTemplate(role);
|
|
18646
|
+
return `${JSON.stringify({
|
|
18647
|
+
role: template.role,
|
|
18648
|
+
events: template.events,
|
|
18649
|
+
command: template.claudeCommand
|
|
18650
|
+
}, null, 2)}\n`;
|
|
18651
|
+
}
|
|
18652
|
+
function renderCodexHookTemplateSource(role) {
|
|
18653
|
+
const template = getAdvisoryHookTemplate(role);
|
|
18654
|
+
return `${JSON.stringify({
|
|
18655
|
+
role: template.role,
|
|
18656
|
+
events: template.events,
|
|
18657
|
+
command: template.codexCommand,
|
|
18658
|
+
commandWindows: template.codexCommandWindows
|
|
18659
|
+
}, null, 2)}\n`;
|
|
18660
|
+
}
|
|
18661
|
+
function buildHooksValue(roles, toHandler) {
|
|
18662
|
+
const selected = new Set(roles);
|
|
18663
|
+
const value = {};
|
|
18664
|
+
for (const role of ADVISORY_HOOK_ROLE_IDS) {
|
|
18665
|
+
if (!selected.has(role)) continue;
|
|
18666
|
+
const template = getAdvisoryHookTemplate(role);
|
|
18667
|
+
for (const event of template.events) {
|
|
18668
|
+
const entries = value[event] ?? [];
|
|
18669
|
+
entries.push({ hooks: [toHandler(template)] });
|
|
18670
|
+
value[event] = entries;
|
|
18671
|
+
}
|
|
18011
18672
|
}
|
|
18012
|
-
|
|
18673
|
+
return value;
|
|
18674
|
+
}
|
|
18675
|
+
/**
|
|
18676
|
+
* Build the value of the `hooks` key for the generated `.claude/settings.json`.
|
|
18677
|
+
* Event order is canonical (template-table order), independent of the order
|
|
18678
|
+
* roles appear in the profile.
|
|
18679
|
+
*/
|
|
18680
|
+
function buildClaudeAdvisoryHooksValue(roles) {
|
|
18681
|
+
return buildHooksValue(roles, (template) => ({
|
|
18682
|
+
type: "command",
|
|
18683
|
+
command: template.claudeCommand
|
|
18684
|
+
}));
|
|
18685
|
+
}
|
|
18686
|
+
/**
|
|
18687
|
+
* Build the full generated `.codex/hooks.json` document. Codex documents
|
|
18688
|
+
* `commandWindows` as the Windows-only command override, so both platform
|
|
18689
|
+
* variants live in the one deterministic artifact.
|
|
18690
|
+
*/
|
|
18691
|
+
function renderCodexHooksJson(roles) {
|
|
18692
|
+
const hooks = buildHooksValue(roles, (template) => ({
|
|
18693
|
+
type: "command",
|
|
18694
|
+
command: template.codexCommand,
|
|
18695
|
+
commandWindows: template.codexCommandWindows
|
|
18696
|
+
}));
|
|
18697
|
+
return `${JSON.stringify({ hooks }, null, 2)}\n`;
|
|
18698
|
+
}
|
|
18699
|
+
/**
|
|
18700
|
+
* Not-supported notes for hook-incapable targets (never silence). Claude and
|
|
18701
|
+
* Codex advisory hooks are generated (both confirmed-official with verified
|
|
18702
|
+
* event lists); Tabnine hook support remains unknown in the capability
|
|
18703
|
+
* matrix, so Tabnine-including profiles get an explicit note.
|
|
18704
|
+
*/
|
|
18705
|
+
function getAdvisoryHookNotes(profile) {
|
|
18706
|
+
if (getSelectedAdvisoryHookRoles(profile).length === 0) return [];
|
|
18707
|
+
const notes = [];
|
|
18708
|
+
if (profile.clients.tabnine.enabled) notes.push({
|
|
18709
|
+
code: "hooks_target_not_generated",
|
|
18710
|
+
path: "/capabilities/hooks",
|
|
18711
|
+
expected: "confirmed-official hook support",
|
|
18712
|
+
actual: "unknown Tabnine hook support",
|
|
18713
|
+
message: "capabilities.hooks advisory roles are not generated for Tabnine: hook support is not confirmed-official in the capability matrix."
|
|
18714
|
+
});
|
|
18715
|
+
return notes;
|
|
18716
|
+
}
|
|
18717
|
+
//#endregion
|
|
18718
|
+
//#region ../../packages/compiler/src/compiler.ts
|
|
18013
18719
|
var TEMPLATE_SOURCES = [
|
|
18014
18720
|
{
|
|
18015
18721
|
id: "targets/agents-md@1",
|
|
@@ -18021,6 +18727,8 @@ var TEMPLATE_SOURCES = [
|
|
|
18021
18727
|
agentsMdTopicTemplateSource("targets/agents-md/60-code-review@1", CODE_REVIEW_TOPIC),
|
|
18022
18728
|
agentsMdTopicTemplateSource("targets/agents-md/70-refactoring@1", REFACTORING_TOPIC),
|
|
18023
18729
|
agentsMdTopicTemplateSource("targets/agents-md/80-documentation@1", DOCUMENTATION_TOPIC),
|
|
18730
|
+
agentsMdTopicTemplateSource("targets/agents-md/85-memory-guidance@1", MEMORY_GUIDANCE_TOPIC),
|
|
18731
|
+
agentsMdTopicTemplateSource("targets/agents-md/86-logging-guidance@1", LOGGING_GUIDANCE_TOPIC),
|
|
18024
18732
|
{
|
|
18025
18733
|
id: "targets/lockfile@1",
|
|
18026
18734
|
target: "lockfile",
|
|
@@ -18038,6 +18746,8 @@ var TEMPLATE_SOURCES = [
|
|
|
18038
18746
|
guidelineTemplateSource("targets/tabnine-guidelines/60-code-review@1", renderCodeReviewGuideline),
|
|
18039
18747
|
guidelineTemplateSource("targets/tabnine-guidelines/70-refactoring@1", renderRefactoringGuideline),
|
|
18040
18748
|
guidelineTemplateSource("targets/tabnine-guidelines/80-documentation@1", renderDocumentationGuideline),
|
|
18749
|
+
guidelineTemplateSource("targets/tabnine-guidelines/85-memory-guidance@1", renderMemoryGuidanceGuideline),
|
|
18750
|
+
guidelineTemplateSource("targets/tabnine-guidelines/86-logging-guidance@1", renderLoggingGuidanceGuideline),
|
|
18041
18751
|
guidelineTemplateSource("targets/tabnine-guidelines/90-final-review@1", renderFinalReviewGuideline),
|
|
18042
18752
|
{
|
|
18043
18753
|
id: "targets/tabnine-mcp-config@1",
|
|
@@ -18051,18 +18761,38 @@ var TEMPLATE_SOURCES = [
|
|
|
18051
18761
|
version: "1",
|
|
18052
18762
|
source: renderCodexConfigToml()
|
|
18053
18763
|
},
|
|
18764
|
+
{
|
|
18765
|
+
id: "targets/codex-hooks@1",
|
|
18766
|
+
target: "codex-hooks",
|
|
18767
|
+
version: "1",
|
|
18768
|
+
source: renderCodexHooksJson(ADVISORY_HOOK_ROLE_IDS)
|
|
18769
|
+
},
|
|
18770
|
+
...ADVISORY_HOOK_ROLE_IDS.map((role) => codexHookTemplateSource(role)),
|
|
18054
18771
|
workflowSkillTemplateSource("targets/codex-workflow-skills/grill-change@1", "codex-workflow-skills", "grill-change"),
|
|
18055
18772
|
workflowSkillTemplateSource("targets/codex-workflow-skills/request-to-spec-issues@1", "codex-workflow-skills", "request-to-spec-issues"),
|
|
18056
18773
|
workflowSkillTemplateSource("targets/codex-workflow-skills/sdd-change@1", "codex-workflow-skills", "sdd-change"),
|
|
18057
18774
|
workflowSkillTemplateSource("targets/codex-workflow-skills/tdd-change@2", "codex-workflow-skills", "tdd-change"),
|
|
18058
18775
|
workflowSkillTemplateSource("targets/codex-workflow-skills/final-review@1", "codex-workflow-skills", "final-review"),
|
|
18059
18776
|
workflowSkillTemplateSource("targets/codex-workflow-skills/subagent-driven-change@1", "codex-workflow-skills", "subagent-driven-change"),
|
|
18777
|
+
workflowSkillTemplateSource("targets/codex-workflow-skills/implement-next@1", "codex-workflow-skills", "implement-next"),
|
|
18778
|
+
workflowSkillTemplateSource("targets/codex-workflow-skills/review-change@1", "codex-workflow-skills", "review-change"),
|
|
18779
|
+
workflowSkillTemplateSource("targets/codex-workflow-skills/security-review@1", "codex-workflow-skills", "security-review"),
|
|
18780
|
+
workflowSkillTemplateSource("targets/codex-workflow-skills/readability-review@1", "codex-workflow-skills", "readability-review"),
|
|
18781
|
+
workflowSkillTemplateSource("targets/codex-workflow-skills/test-review@1", "codex-workflow-skills", "test-review"),
|
|
18782
|
+
workflowSkillTemplateSource("targets/codex-workflow-skills/architecture-review@1", "codex-workflow-skills", "architecture-review"),
|
|
18783
|
+
workflowSkillTemplateSource("targets/codex-workflow-skills/loop-implement-test-fix@1", "codex-workflow-skills", "loop-implement-test-fix"),
|
|
18784
|
+
workflowSkillTemplateSource("targets/codex-workflow-skills/loop-review-patch-retest@1", "codex-workflow-skills", "loop-review-patch-retest"),
|
|
18785
|
+
workflowSkillTemplateSource("targets/codex-workflow-skills/loop-security-patch-retest@1", "codex-workflow-skills", "loop-security-patch-retest"),
|
|
18786
|
+
workflowSkillTemplateSource("targets/codex-workflow-skills/loop-docs-update@1", "codex-workflow-skills", "loop-docs-update"),
|
|
18787
|
+
workflowSkillTemplateSource("targets/codex-workflow-skills/loop-sdd-cycle@1", "codex-workflow-skills", "loop-sdd-cycle"),
|
|
18788
|
+
workflowSkillTemplateSource("targets/codex-workflow-skills/mcp-fit-check@1", "codex-workflow-skills", "mcp-fit-check"),
|
|
18060
18789
|
{
|
|
18061
18790
|
id: "targets/claude-settings@1",
|
|
18062
18791
|
target: "claude-settings",
|
|
18063
18792
|
version: "1",
|
|
18064
18793
|
source: renderClaudeSettingsJson()
|
|
18065
18794
|
},
|
|
18795
|
+
...ADVISORY_HOOK_ROLE_IDS.map((role) => advisoryHookTemplateSource(role)),
|
|
18066
18796
|
{
|
|
18067
18797
|
id: "targets/claude-mcp@1",
|
|
18068
18798
|
target: "claude-mcp",
|
|
@@ -18080,7 +18810,19 @@ var TEMPLATE_SOURCES = [
|
|
|
18080
18810
|
workflowSkillTemplateSource("targets/claude-workflow-skills/sdd-change@1", "claude-workflow-skills", "sdd-change"),
|
|
18081
18811
|
workflowSkillTemplateSource("targets/claude-workflow-skills/tdd-change@2", "claude-workflow-skills", "tdd-change"),
|
|
18082
18812
|
workflowSkillTemplateSource("targets/claude-workflow-skills/final-review@1", "claude-workflow-skills", "final-review"),
|
|
18083
|
-
workflowSkillTemplateSource("targets/claude-workflow-skills/subagent-driven-change@1", "claude-workflow-skills", "subagent-driven-change")
|
|
18813
|
+
workflowSkillTemplateSource("targets/claude-workflow-skills/subagent-driven-change@1", "claude-workflow-skills", "subagent-driven-change"),
|
|
18814
|
+
workflowSkillTemplateSource("targets/claude-workflow-skills/implement-next@1", "claude-workflow-skills", "implement-next"),
|
|
18815
|
+
workflowSkillTemplateSource("targets/claude-workflow-skills/review-change@1", "claude-workflow-skills", "review-change"),
|
|
18816
|
+
workflowSkillTemplateSource("targets/claude-workflow-skills/security-review@1", "claude-workflow-skills", "security-review"),
|
|
18817
|
+
workflowSkillTemplateSource("targets/claude-workflow-skills/readability-review@1", "claude-workflow-skills", "readability-review"),
|
|
18818
|
+
workflowSkillTemplateSource("targets/claude-workflow-skills/test-review@1", "claude-workflow-skills", "test-review"),
|
|
18819
|
+
workflowSkillTemplateSource("targets/claude-workflow-skills/architecture-review@1", "claude-workflow-skills", "architecture-review"),
|
|
18820
|
+
workflowSkillTemplateSource("targets/claude-workflow-skills/loop-implement-test-fix@1", "claude-workflow-skills", "loop-implement-test-fix"),
|
|
18821
|
+
workflowSkillTemplateSource("targets/claude-workflow-skills/loop-review-patch-retest@1", "claude-workflow-skills", "loop-review-patch-retest"),
|
|
18822
|
+
workflowSkillTemplateSource("targets/claude-workflow-skills/loop-security-patch-retest@1", "claude-workflow-skills", "loop-security-patch-retest"),
|
|
18823
|
+
workflowSkillTemplateSource("targets/claude-workflow-skills/loop-docs-update@1", "claude-workflow-skills", "loop-docs-update"),
|
|
18824
|
+
workflowSkillTemplateSource("targets/claude-workflow-skills/loop-sdd-cycle@1", "claude-workflow-skills", "loop-sdd-cycle"),
|
|
18825
|
+
workflowSkillTemplateSource("targets/claude-workflow-skills/mcp-fit-check@1", "claude-workflow-skills", "mcp-fit-check")
|
|
18084
18826
|
];
|
|
18085
18827
|
function getDefaultTemplates() {
|
|
18086
18828
|
return TEMPLATE_SOURCES.map(({ id, target, version, source }) => ({
|
|
@@ -18100,12 +18842,45 @@ function compileProfile(request) {
|
|
|
18100
18842
|
};
|
|
18101
18843
|
const files = targets.flatMap((target) => renderTarget(target, request.profile));
|
|
18102
18844
|
const requiredTemplateIds = getRequiredTemplateIdSet(targets, request.profile);
|
|
18845
|
+
const notes = [
|
|
18846
|
+
...getAdvisoryHookNotes(request.profile),
|
|
18847
|
+
...getAutomationPackNotes(request.profile),
|
|
18848
|
+
...getImplementNextNotes(request.profile)
|
|
18849
|
+
];
|
|
18103
18850
|
return {
|
|
18104
18851
|
ok: true,
|
|
18105
18852
|
files: files.sort(compareGeneratedFiles),
|
|
18106
|
-
templates: templates.filter((template) => requiredTemplateIds.has(template.id)).sort(compareTemplates)
|
|
18853
|
+
templates: templates.filter((template) => requiredTemplateIds.has(template.id)).sort(compareTemplates),
|
|
18854
|
+
...notes.length > 0 ? { notes } : {}
|
|
18107
18855
|
};
|
|
18108
18856
|
}
|
|
18857
|
+
/**
|
|
18858
|
+
* Not-supported notes for the automation pack on a Tabnine-including target set
|
|
18859
|
+
* (never silence). Loop skills emit only for Claude and Codex; a profile that
|
|
18860
|
+
* selects `automation` with Tabnine enabled gets an explicit informational
|
|
18861
|
+
* note instead of silent omission.
|
|
18862
|
+
*/
|
|
18863
|
+
function getAutomationPackNotes(profile) {
|
|
18864
|
+
if (!(profile.capabilities?.skills?.packs ?? []).includes("automation") || !profile.clients.tabnine.enabled) return [];
|
|
18865
|
+
return [automationTabnineNote("/capabilities/skills/packs")];
|
|
18866
|
+
}
|
|
18867
|
+
/**
|
|
18868
|
+
* Phase 24 (I4): `implement-next` never silences a missing-capability target.
|
|
18869
|
+
* When its prerequisites are met but Tabnine is enabled, emit an informational
|
|
18870
|
+
* note (mirroring the WS6 automation-pack pattern): Tabnine is not
|
|
18871
|
+
* `confirmed-official` for the subagent chain the dispatcher drives, so the
|
|
18872
|
+
* skill is generated for Claude and Codex only.
|
|
18873
|
+
*/
|
|
18874
|
+
function getImplementNextNotes(profile) {
|
|
18875
|
+
if (!emitsImplementNext(profile.workflow) || !profile.clients.tabnine.enabled) return [];
|
|
18876
|
+
return [{
|
|
18877
|
+
code: "implement_next_target_not_generated",
|
|
18878
|
+
path: "/workflow/subagentDrivenDevelopment",
|
|
18879
|
+
expected: "skills-capable client with a confirmed-official subagent chain (Claude or Codex)",
|
|
18880
|
+
actual: "Tabnine has no implement-next dispatcher surface",
|
|
18881
|
+
message: "implement-next is not generated for Tabnine: the ledger dispatcher targets skills-capable clients with a confirmed-official subagent chain (Claude and Codex) only."
|
|
18882
|
+
}];
|
|
18883
|
+
}
|
|
18109
18884
|
function mergeTemplates(base, extra) {
|
|
18110
18885
|
const seen = new Set(base.map((template) => template.id));
|
|
18111
18886
|
const result = [...base];
|
|
@@ -18132,7 +18907,7 @@ function getSubagentTemplates(profile) {
|
|
|
18132
18907
|
version: "1",
|
|
18133
18908
|
sha256: sha256Hex(normalizeGeneratedText(renderCodexSubagent(agent, effective)))
|
|
18134
18909
|
});
|
|
18135
|
-
if (profile.clients.tabnine.enabled) for (const agent of
|
|
18910
|
+
if (profile.clients.tabnine.enabled) for (const agent of getTabnineSubagents(profile)) {
|
|
18136
18911
|
if (agent.toolScope !== "read-only") continue;
|
|
18137
18912
|
templates.push({
|
|
18138
18913
|
id: `targets/tabnine-subagents/${agent.name}@1`,
|
|
@@ -18147,9 +18922,11 @@ function renderAgentsMd(profile) {
|
|
|
18147
18922
|
const effectivePermissions = deriveEffectivePermissions(profile);
|
|
18148
18923
|
const enabledClients = renderEnabledClients(profile);
|
|
18149
18924
|
const reactSection = profile.stack.frameworks.includes("react") ? `\n${renderTopicAsAgentsMdSection(REACT_STACK_TOPIC)}` : "";
|
|
18150
|
-
const codeReviewSection = profile.workflow.codeReview === true ? `\n${renderTopicAsAgentsMdSection(CODE_REVIEW_TOPIC)}` : "";
|
|
18925
|
+
const codeReviewSection = profile.workflow.codeReview === true && !profile.clients.codex.enabled && !profile.clients.claude.enabled ? `\n${renderTopicAsAgentsMdSection(CODE_REVIEW_TOPIC)}` : "";
|
|
18151
18926
|
const refactoringSection = profile.workflow.refactoring === true ? `\n${renderTopicAsAgentsMdSection(REFACTORING_TOPIC)}` : "";
|
|
18152
18927
|
const documentationSection = profile.workflow.documentation === true ? `\n${renderTopicAsAgentsMdSection(DOCUMENTATION_TOPIC)}` : "";
|
|
18928
|
+
const memoryGuidanceSection = profile.workflow.memoryGuidance === true ? `\n${renderTopicAsAgentsMdSection(MEMORY_GUIDANCE_TOPIC)}` : "";
|
|
18929
|
+
const loggingGuidanceSection = profile.workflow.loggingGuidance === true ? `\n${renderTopicAsAgentsMdSection(LOGGING_GUIDANCE_TOPIC)}` : "";
|
|
18153
18930
|
return normalizeGeneratedText(`# AGENTS.md
|
|
18154
18931
|
|
|
18155
18932
|
## Instruction Precedence
|
|
@@ -18178,7 +18955,7 @@ ${enabledClients}
|
|
|
18178
18955
|
- SDD: ${renderRequired(profile.workflow.sdd)}
|
|
18179
18956
|
- TDD: ${renderRequired(profile.workflow.tdd)}
|
|
18180
18957
|
- Final implementation review: ${renderRequired(profile.workflow.finalReview)}
|
|
18181
|
-
${codeReviewSection}${refactoringSection}${documentationSection}
|
|
18958
|
+
${codeReviewSection}${refactoringSection}${documentationSection}${memoryGuidanceSection}${loggingGuidanceSection}
|
|
18182
18959
|
## Permissions
|
|
18183
18960
|
|
|
18184
18961
|
| Permission | Mode |
|
|
@@ -18251,11 +19028,16 @@ function renderTarget(target, profile) {
|
|
|
18251
19028
|
case "lockfile": return [];
|
|
18252
19029
|
case "tabnine-mcp-config": return [createGeneratedTextFile(".tabnine/mcp_servers.json", "tabnine-mcp-config", "targets/tabnine-mcp-config@1", JSON.stringify({ mcpServers: {} }, null, 2))];
|
|
18253
19030
|
case "codex-config": return [createGeneratedTextFile(".codex/config.toml", "codex-config", "targets/codex-config@1", renderCodexConfigToml(profile))];
|
|
19031
|
+
case "codex-hooks": {
|
|
19032
|
+
const roles = getSelectedAdvisoryHookRoles(profile);
|
|
19033
|
+
if (roles.length === 0) return [];
|
|
19034
|
+
return [createGeneratedTextFile(".codex/hooks.json", "codex-hooks", "targets/codex-hooks@1", renderCodexHooksJson(roles))];
|
|
19035
|
+
}
|
|
18254
19036
|
case "codex-subagents": return renderCodexSubagentFiles(profile);
|
|
18255
19037
|
case "claude-subagents": return renderClaudeSubagentFiles(profile);
|
|
18256
19038
|
case "tabnine-subagents": return renderTabnineSubagentFiles(profile);
|
|
18257
19039
|
case "codex-workflow-skills": return renderWorkflowSkillFiles(profile, "codex-workflow-skills", ".agents/skills");
|
|
18258
|
-
case "claude-settings": return [createGeneratedTextFile(".claude/settings.json", "claude-settings", "targets/claude-settings@1", renderClaudeSettingsJson())];
|
|
19040
|
+
case "claude-settings": return [createGeneratedTextFile(".claude/settings.json", "claude-settings", "targets/claude-settings@1", renderClaudeSettingsJson(profile))];
|
|
18259
19041
|
case "claude-mcp": return [createGeneratedTextFile(".mcp.json", "claude-mcp", "targets/claude-mcp@1", JSON.stringify({ mcpServers: {} }, null, 2))];
|
|
18260
19042
|
case "claude-md": return [createGeneratedTextFile("CLAUDE.md", "claude-md", "targets/claude-md@1", renderClaudeMd())];
|
|
18261
19043
|
case "claude-workflow-skills": return renderWorkflowSkillFiles(profile, "claude-workflow-skills", ".claude/skills");
|
|
@@ -18273,19 +19055,38 @@ function renderTabnineGuidelines(profile) {
|
|
|
18273
19055
|
if (hasStack(profile, "frameworks", "react")) files.push(createGeneratedTextFile(".tabnine/guidelines/30-stack-typescript-react.md", common.target, "targets/tabnine-guidelines/30-stack-typescript-react@1", renderTypeScriptReactGuideline()));
|
|
18274
19056
|
if (hasStack(profile, "languages", "java") && hasStack(profile, "frameworks", "spring-boot")) files.push(createGeneratedTextFile(".tabnine/guidelines/40-stack-java-spring.md", common.target, "targets/tabnine-guidelines/40-stack-java-spring@1", renderJavaSpringGuideline()));
|
|
18275
19057
|
if (hasAnyStack(profile, "testing", ["playwright", "junit"])) files.push(createGeneratedTextFile(".tabnine/guidelines/50-testing-playwright-junit.md", common.target, "targets/tabnine-guidelines/50-testing-playwright-junit@1", renderPlaywrightJunitGuideline()));
|
|
18276
|
-
if (profile.
|
|
19058
|
+
if (resolveSelectedSkills(profile).includes("review-change")) files.push(createGeneratedTextFile(".tabnine/guidelines/60-code-review.md", common.target, "targets/tabnine-guidelines/60-code-review@1", renderCodeReviewGuideline()));
|
|
18277
19059
|
if (profile.workflow.refactoring === true) files.push(createGeneratedTextFile(".tabnine/guidelines/70-refactoring.md", common.target, "targets/tabnine-guidelines/70-refactoring@1", renderRefactoringGuideline()));
|
|
18278
19060
|
if (profile.workflow.documentation === true) files.push(createGeneratedTextFile(".tabnine/guidelines/80-documentation.md", common.target, "targets/tabnine-guidelines/80-documentation@1", renderDocumentationGuideline()));
|
|
19061
|
+
if (profile.workflow.memoryGuidance === true) files.push(createGeneratedTextFile(".tabnine/guidelines/85-memory-guidance.md", common.target, "targets/tabnine-guidelines/85-memory-guidance@1", renderMemoryGuidanceGuideline()));
|
|
19062
|
+
if (profile.workflow.loggingGuidance === true) files.push(createGeneratedTextFile(".tabnine/guidelines/86-logging-guidance.md", common.target, "targets/tabnine-guidelines/86-logging-guidance@1", renderLoggingGuidanceGuideline()));
|
|
18279
19063
|
if (profile.workflow.finalReview) files.push(createGeneratedTextFile(".tabnine/guidelines/90-final-review.md", common.target, "targets/tabnine-guidelines/90-final-review@1", renderFinalReviewGuideline()));
|
|
18280
19064
|
return files;
|
|
18281
19065
|
}
|
|
18282
19066
|
function renderWorkflowSkillFiles(profile, target, rootPath) {
|
|
18283
|
-
|
|
19067
|
+
const selected = resolveSelectedSkills(profile);
|
|
19068
|
+
const selectedSet = new Set(selected);
|
|
19069
|
+
const loggingOn = profile.workflow.loggingGuidance === true;
|
|
19070
|
+
return selected.map((skill) => createGeneratedTextFile(`${rootPath}/${skill}/SKILL.md`, target, getWorkflowSkillTemplateId(target, skill), applyModelInvocationPolicy(applyLoggingEnforcementToSkill(renderWorkflowSkill(skill, selectedSet), skill, loggingOn), skill, target)));
|
|
19071
|
+
}
|
|
19072
|
+
/**
|
|
19073
|
+
* Phase 24 (I1): inject the `disable-model-invocation: true` frontmatter line
|
|
19074
|
+
* for entry-point skills on targets that verifiably support it (see
|
|
19075
|
+
* `disablesModelInvocation`). The flag is appended as the last frontmatter key,
|
|
19076
|
+
* just before the closing `---`, keeping `name`/`description` first.
|
|
19077
|
+
*/
|
|
19078
|
+
function applyModelInvocationPolicy(source, skill, target) {
|
|
19079
|
+
if (!disablesModelInvocation(skill, target)) return source;
|
|
19080
|
+
const lines = source.split("\n");
|
|
19081
|
+
const closeIndex = lines.indexOf("---", 1);
|
|
19082
|
+
if (closeIndex === -1) return source;
|
|
19083
|
+
lines.splice(closeIndex, 0, "disable-model-invocation: true");
|
|
19084
|
+
return lines.join("\n");
|
|
18284
19085
|
}
|
|
18285
19086
|
function getWorkflowSkillTemplateId(target, skill) {
|
|
18286
19087
|
return `targets/${target}/${skill}@${skill === "tdd-change" ? "2" : "1"}`;
|
|
18287
19088
|
}
|
|
18288
|
-
function renderWorkflowSkill(skill) {
|
|
19089
|
+
function renderWorkflowSkill(skill, selectedSkills = /* @__PURE__ */ new Set()) {
|
|
18289
19090
|
switch (skill) {
|
|
18290
19091
|
case "grill-change": return `---
|
|
18291
19092
|
name: grill-change
|
|
@@ -18319,6 +19120,20 @@ Question: \`<one decision or missing fact>\`
|
|
|
18319
19120
|
Recommended answer: \`<the default direction you would choose>\`
|
|
18320
19121
|
Why: \`<short reason based on product intent, safety, contracts, or repo evidence>\`
|
|
18321
19122
|
|
|
19123
|
+
## Design-it-Twice
|
|
19124
|
+
|
|
19125
|
+
For a hard-to-reverse choice, present it as a Design-it-Twice question: sketch two genuinely different paths before recommending one.
|
|
19126
|
+
|
|
19127
|
+
Path A: \`<approach>\` - interface: \`<the shape callers see>\`; risks: \`<what could go wrong>\`.
|
|
19128
|
+
Path B: \`<a genuinely different approach>\` - interface: \`<the shape callers see>\`; risks: \`<what could go wrong>\`.
|
|
19129
|
+
Recommendation: \`<the path you would choose and why>\`.
|
|
19130
|
+
|
|
19131
|
+
Do not offer two variations of the same path. Reserve this form for choices that are expensive to change later; a routine choice needs one recommended answer, not two paths.
|
|
19132
|
+
|
|
19133
|
+
## ADR Candidates
|
|
19134
|
+
|
|
19135
|
+
Capture a decision as an ADR candidate when it is hard to reverse, surprising without context, or carries real trade-offs. Record the decision, the alternatives considered, and the reason as an agreement-record note only. Do not write an ADR file during the grill; synthesis persists it after approval.
|
|
19136
|
+
|
|
18322
19137
|
## Decision Checks
|
|
18323
19138
|
|
|
18324
19139
|
Before ending the grill, confirm:
|
|
@@ -18344,6 +19159,7 @@ When the user agrees the grill is complete, return:
|
|
|
18344
19159
|
- Decisions made
|
|
18345
19160
|
- Durable terms and hard-to-reverse decisions
|
|
18346
19161
|
- Decision rules for implementation tradeoffs
|
|
19162
|
+
- ADR candidates that meet the threshold
|
|
18347
19163
|
- Open questions or risks
|
|
18348
19164
|
- Confirmation that post-grill synthesis can run next
|
|
18349
19165
|
|
|
@@ -18422,6 +19238,31 @@ Include these sections:
|
|
|
18422
19238
|
\`TDD Strategy\` complements \`Tests\`; it must not replace the required \`Tests\`
|
|
18423
19239
|
section from \`docs/specs/SPEC_TEMPLATE.md\`.
|
|
18424
19240
|
|
|
19241
|
+
## Seam & Interface Design
|
|
19242
|
+
|
|
19243
|
+
Decide the test seam and mock boundary now, under this human gate, so the TDD loop runs without new architecture decisions.
|
|
19244
|
+
|
|
19245
|
+
Classify each slice:
|
|
19246
|
+
|
|
19247
|
+
- computation: pure input to output; the seam is the function's return value.
|
|
19248
|
+
- orchestration: coordinates other units; the seam is the observable effect at the boundary it drives.
|
|
19249
|
+
- deterministic generator: input profile to emitted artifacts; the seam is the generated output compared as a fixture.
|
|
19250
|
+
|
|
19251
|
+
Seam rules:
|
|
19252
|
+
|
|
19253
|
+
- Pick the highest boundary that keeps tests fast and deterministic; prefer fewer, higher seams over many low ones.
|
|
19254
|
+
- Prefer an existing seam over inventing a new one.
|
|
19255
|
+
- Declare the allowed mock boundary as unmanaged dependencies only, such as network, clock, or filesystem you do not own; never mock the code under test.
|
|
19256
|
+
- Sizing rule: one slice = one seam = one observable outcome = one RED.
|
|
19257
|
+
|
|
19258
|
+
Human-gate checklist to confirm before writing briefs:
|
|
19259
|
+
|
|
19260
|
+
1. Is the seam at the highest fast, deterministic boundary?
|
|
19261
|
+
2. Is the unit under test treated as a black box?
|
|
19262
|
+
3. Do inputs and outputs cross an explicit interface?
|
|
19263
|
+
4. Are the names drawn from the glossary?
|
|
19264
|
+
5. Does an abstraction exist only for the test?
|
|
19265
|
+
|
|
18425
19266
|
## Issue Brief Format
|
|
18426
19267
|
|
|
18427
19268
|
Each issue brief must include:
|
|
@@ -18434,6 +19275,8 @@ Each issue brief must include:
|
|
|
18434
19275
|
- Acceptance criteria
|
|
18435
19276
|
- Expected RED proof
|
|
18436
19277
|
- Expected GREEN proof
|
|
19278
|
+
- Seam under test
|
|
19279
|
+
- Allowed mock boundary
|
|
18437
19280
|
- Test command guidance
|
|
18438
19281
|
- Likely file ownership
|
|
18439
19282
|
- Dependencies
|
|
@@ -18454,6 +19297,15 @@ Use these states:
|
|
|
18454
19297
|
- \`sequenced\`
|
|
18455
19298
|
- \`human-gate\`
|
|
18456
19299
|
|
|
19300
|
+
## Persisted Artifacts
|
|
19301
|
+
|
|
19302
|
+
After the user approves the synthesis, persist workflow state in one write step. All writes go through the client's write-approval flow.
|
|
19303
|
+
|
|
19304
|
+
- \`TASKS.md\`: an index-only ledger. Each row links to a brief and carries one state from the closed set \`ready | blocked | sequenced | parallel-safe | human-gate | in-progress | done\`. Keep task content in the briefs, not the ledger.
|
|
19305
|
+
- \`docs/specs/<spec-dir>/issues/NNN-slug.md\`: one brief per slice, using the Issue Brief Format above.
|
|
19306
|
+
- \`CONTEXT.md\`: a glossary only, created lazily when the first durable term appears. Each definition is at most two sentences; add an \`Avoid:\` line for terms that must not be used. No implementation details or decisions.
|
|
19307
|
+
- ADRs: record a decision that meets all three criteria - hard to reverse, surprising without context, real trade-offs. Write to the existing project ADR directory if present, otherwise \`docs/adr/\`.
|
|
19308
|
+
|
|
18457
19309
|
## Output
|
|
18458
19310
|
|
|
18459
19311
|
Return:
|
|
@@ -18520,12 +19372,26 @@ description: Use when changing behavior where a focused failing test or golden f
|
|
|
18520
19372
|
|
|
18521
19373
|
## Testing Anti-Patterns
|
|
18522
19374
|
|
|
19375
|
+
- Do not write a tautological test: expected values must come from an independent source, never recomputed the way the code under test computes them.
|
|
18523
19376
|
- Do not assert on mock elements or mock call counts when a real behavior assertion is possible.
|
|
18524
19377
|
- Do not add production methods, flags, or exports that exist only for tests.
|
|
18525
19378
|
- Do not mock a dependency until you understand the side effects the test needs.
|
|
18526
19379
|
- Keep test doubles structurally complete enough to match the real data shape consumed by the code.
|
|
18527
19380
|
- If mock setup is larger than the behavior under test, consider a narrower integration test or a simpler production boundary.
|
|
18528
19381
|
|
|
19382
|
+
## Mock Boundary
|
|
19383
|
+
|
|
19384
|
+
- Mock only unmanaged external dependencies, such as network, clock, or filesystem you do not own.
|
|
19385
|
+
- Prefer a fake over a stub, and a stub over a mock or spy.
|
|
19386
|
+
- Use a spy only where outbound communication is itself the tested contract.
|
|
19387
|
+
- Never introduce an abstraction that exists only for a test.
|
|
19388
|
+
|
|
19389
|
+
## Seam Discipline
|
|
19390
|
+
|
|
19391
|
+
- Read \`CONTEXT.md\` when it exists; test names and interface names must match its glossary terms.
|
|
19392
|
+
- Test only at the seam declared in the issue brief; do not re-decide the seam inside the loop.
|
|
19393
|
+
- If implementation shows the declared seam is wrong, stop and report \`BLOCKED\` with the reason. Never silently move or redesign the seam.
|
|
19394
|
+
|
|
18529
19395
|
## Output
|
|
18530
19396
|
|
|
18531
19397
|
Report the RED command and expected failure, the GREEN command and passing result, any refactor rerun, and any TDD exception that required human approval.
|
|
@@ -18607,6 +19473,76 @@ Code-quality reviewer status values: \`ACCEPTABLE\`, \`ISSUES_FOUND\`, \`NEEDS_C
|
|
|
18607
19473
|
|
|
18608
19474
|
Final handoff must list what changed, tests run, contract impact, security impact, remaining risks or TODOs, and whether the spec acceptance criteria are fully met.
|
|
18609
19475
|
`;
|
|
19476
|
+
case "implement-next": return `---
|
|
19477
|
+
name: implement-next
|
|
19478
|
+
description: Use after synthesis to dispatch the next ready task from the TASKS.md ledger through one subagent-driven implementation cycle, one task per invocation.
|
|
19479
|
+
---
|
|
19480
|
+
|
|
19481
|
+
<!-- Generated by Agent Profile Compiler. Do not edit by hand. -->
|
|
19482
|
+
|
|
19483
|
+
# Implement Next
|
|
19484
|
+
|
|
19485
|
+
## Purpose
|
|
19486
|
+
|
|
19487
|
+
Advance exactly one ready task from the \`TASKS.md\` ledger through a single implementation cycle, using its persisted issue brief as context. One invocation advances at most one task; it never iterates. Repeat the command for the next task.
|
|
19488
|
+
|
|
19489
|
+
## Preconditions
|
|
19490
|
+
|
|
19491
|
+
- \`TASKS.md\` exists and is an index-only ledger whose rows link to issue briefs.
|
|
19492
|
+
- If \`TASKS.md\` is missing or contains no \`ready\` task, stop and report the ledger state; do not invent work.
|
|
19493
|
+
|
|
19494
|
+
## Flow
|
|
19495
|
+
|
|
19496
|
+
1. Read \`TASKS.md\` and select the first task in state \`ready\`.
|
|
19497
|
+
- Stop at a \`human-gate\` task and explain the approval it needs; do not proceed past it.
|
|
19498
|
+
- Skip \`blocked\` and \`sequenced\` tasks; they are not ready.
|
|
19499
|
+
- If no \`ready\` task exists, stop and report.
|
|
19500
|
+
2. Mark the selected task \`in-progress\` in \`TASKS.md\` through the client's write-approval flow.
|
|
19501
|
+
3. Load the linked issue brief and run \`subagent-driven-change\` with the brief as Fresh Context: \`implementer\`, then \`spec-reviewer\`, then \`code-quality-reviewer\`.
|
|
19502
|
+
4. When reviews pass and the required tests run green, mark the task \`done\` and stop. The next task requires a new invocation.
|
|
19503
|
+
|
|
19504
|
+
## Failure Path
|
|
19505
|
+
|
|
19506
|
+
Stop and report \`BLOCKED\` when any of these holds:
|
|
19507
|
+
|
|
19508
|
+
- \`implementer\` returns \`BLOCKED\` or \`NEEDS_CONTEXT\`,
|
|
19509
|
+
- a review finding cannot be resolved within the brief's scope,
|
|
19510
|
+
- GREEN is unreachable within the brief's declared seam.
|
|
19511
|
+
|
|
19512
|
+
On failure, mark the task \`blocked\` in \`TASKS.md\` with a one-line reason; if the declared seam was wrong, include why it failed. Then stop. Do not touch the next task, do not edit the brief, and do not continue to another task. A human decides whether to edit the brief, re-grill, or split the task, and flips the state back to \`ready\`.
|
|
19513
|
+
|
|
19514
|
+
## Output
|
|
19515
|
+
|
|
19516
|
+
Report the selected task, the state transitions applied, the subagent results, the tests run, and the final state (\`done\` or \`blocked\` with its one-line reason).
|
|
19517
|
+
|
|
19518
|
+
## Safety
|
|
19519
|
+
|
|
19520
|
+
- Do not upload source code.
|
|
19521
|
+
- Do not read or print secrets.
|
|
19522
|
+
- Do not iterate across tasks; one invocation advances at most one task.
|
|
19523
|
+
- Do not self-approve; all writes, commits, and destructive steps go through the client's write-approval flow.
|
|
19524
|
+
- Do not edit issue briefs or advance a task that failed.
|
|
19525
|
+
- Do not propose \`bypassPermissions\`, tool pre-approval, dependency auto-installation, hosted execution, or remote MCP behavior.
|
|
19526
|
+
`;
|
|
19527
|
+
case "review-change": return renderReviewChangeSkill(selectedSkills);
|
|
19528
|
+
case "security-review":
|
|
19529
|
+
case "readability-review":
|
|
19530
|
+
case "test-review":
|
|
19531
|
+
case "architecture-review": {
|
|
19532
|
+
const rendered = renderSpecialistReviewSkill(skill);
|
|
19533
|
+
if (rendered === void 0) throw new Error(`Missing specialist review content for ${skill}.`);
|
|
19534
|
+
return rendered;
|
|
19535
|
+
}
|
|
19536
|
+
case "loop-implement-test-fix":
|
|
19537
|
+
case "loop-review-patch-retest":
|
|
19538
|
+
case "loop-security-patch-retest":
|
|
19539
|
+
case "loop-docs-update":
|
|
19540
|
+
case "loop-sdd-cycle": {
|
|
19541
|
+
const rendered = renderLoopSkillContent(skill, selectedSkills);
|
|
19542
|
+
if (rendered === void 0) throw new Error(`Missing loop skill content for ${skill}.`);
|
|
19543
|
+
return rendered;
|
|
19544
|
+
}
|
|
19545
|
+
case "mcp-fit-check": return renderMcpFitCheckSkill();
|
|
18610
19546
|
}
|
|
18611
19547
|
}
|
|
18612
19548
|
function renderGeneralAgentBehaviorGuideline(profile) {
|
|
@@ -18700,6 +19636,66 @@ function renderRefactoringGuideline() {
|
|
|
18700
19636
|
function renderDocumentationGuideline() {
|
|
18701
19637
|
return renderTopicAsTabnineGuideline(DOCUMENTATION_TOPIC);
|
|
18702
19638
|
}
|
|
19639
|
+
function renderMemoryGuidanceGuideline() {
|
|
19640
|
+
return renderTopicAsTabnineGuideline(MEMORY_GUIDANCE_TOPIC);
|
|
19641
|
+
}
|
|
19642
|
+
function renderLoggingGuidanceGuideline() {
|
|
19643
|
+
return renderTopicAsTabnineGuideline(LOGGING_GUIDANCE_TOPIC);
|
|
19644
|
+
}
|
|
19645
|
+
/**
|
|
19646
|
+
* Phase 25 (I2): flag-conditional logging-enforcement text. These lines
|
|
19647
|
+
* REFERENCE the Logging Guidance convention (emitted into AGENTS.md/CLAUDE.md
|
|
19648
|
+
* by I1); they never restate the verbatim redaction rule (single source of
|
|
19649
|
+
* truth, ADR 0008). They are injected at emission time, gated on
|
|
19650
|
+
* `workflow.loggingGuidance`, mirroring `applyModelInvocationPolicy`. Tabnine
|
|
19651
|
+
* is documentation-only (ADR 0007) and never receives these lines.
|
|
19652
|
+
*/
|
|
19653
|
+
var LOGGING_ENFORCEMENT_BY_AGENT = {
|
|
19654
|
+
implementer: "Follow the project's logging convention (the Logging Guidance section in AGENTS.md). If debug or diagnostic output you added is still present when you would otherwise report DONE, report DONE_WITH_CONCERNS and name the leftover output instead.",
|
|
19655
|
+
"code-quality-reviewer": "Check logging discipline in the change: stray print/console output left in production code, new error paths lacking a stable event code, and any log that violates the redaction rule in the project's Logging Guidance convention. Reference that rule; do not restate it."
|
|
19656
|
+
};
|
|
19657
|
+
var LOGGING_ENFORCEMENT_FINAL_REVIEW = "Confirm debug output added during the change was removed and any new error paths carry a stable event code, per the project's Logging Guidance convention.";
|
|
19658
|
+
/**
|
|
19659
|
+
* Append the flag-conditional logging-enforcement paragraph to the emitted
|
|
19660
|
+
* prompt for the agents in `LOGGING_ENFORCEMENT_BY_AGENT`. Returns the prompt
|
|
19661
|
+
* unchanged for any other agent or when the flag is off. The appended text is
|
|
19662
|
+
* plain prose with no `"""`, so the Codex renderer's triple-quote guard is
|
|
19663
|
+
* preserved.
|
|
19664
|
+
*/
|
|
19665
|
+
function applyLoggingEnforcementToPrompt(prompt, agentName, loggingOn) {
|
|
19666
|
+
if (!loggingOn) return prompt;
|
|
19667
|
+
const enforcement = LOGGING_ENFORCEMENT_BY_AGENT[agentName];
|
|
19668
|
+
if (enforcement === void 0) return prompt;
|
|
19669
|
+
return `${prompt.trimEnd()}\n\n${enforcement}`;
|
|
19670
|
+
}
|
|
19671
|
+
/**
|
|
19672
|
+
* Insert the flag-conditional logging checklist item into the `final-review`
|
|
19673
|
+
* skill's `## Instructions` numbered list, just before the following section.
|
|
19674
|
+
* Returns the source unchanged for any other skill or when the flag is off.
|
|
19675
|
+
*
|
|
19676
|
+
* Assumes the Instructions list is flat and monotonically numbered (1..N with
|
|
19677
|
+
* no nesting); the appended item is numbered N+1. A template change that
|
|
19678
|
+
* breaks this assumption shifts the emitted bytes and fails the golden
|
|
19679
|
+
* fixtures, so it cannot ship silently.
|
|
19680
|
+
*/
|
|
19681
|
+
function applyLoggingEnforcementToSkill(source, skill, loggingOn) {
|
|
19682
|
+
if (!loggingOn || skill !== "final-review") return source;
|
|
19683
|
+
const lines = source.split("\n");
|
|
19684
|
+
const instructionsIndex = lines.indexOf("## Instructions");
|
|
19685
|
+
if (instructionsIndex === -1) return source;
|
|
19686
|
+
let lastItemIndex = -1;
|
|
19687
|
+
for (let i = instructionsIndex + 1; i < lines.length; i += 1) {
|
|
19688
|
+
const line = lines[i];
|
|
19689
|
+
if (line !== void 0 && line.startsWith("## ")) break;
|
|
19690
|
+
if (line !== void 0 && /^\d+\.\s/u.test(line)) lastItemIndex = i;
|
|
19691
|
+
}
|
|
19692
|
+
if (lastItemIndex === -1) return source;
|
|
19693
|
+
const match = lines[lastItemIndex]?.match(/^(\d+)\.\s/u);
|
|
19694
|
+
if (!match || match[1] === void 0) return source;
|
|
19695
|
+
const nextNumber = Number.parseInt(match[1], 10) + 1;
|
|
19696
|
+
lines.splice(lastItemIndex + 1, 0, `${nextNumber}. ${LOGGING_ENFORCEMENT_FINAL_REVIEW}`);
|
|
19697
|
+
return lines.join("\n");
|
|
19698
|
+
}
|
|
18703
19699
|
function renderTypeScriptSvelteGuideline() {
|
|
18704
19700
|
return `<!-- Generated by Agent Profile Compiler. Do not edit by hand. -->
|
|
18705
19701
|
|
|
@@ -18777,15 +19773,36 @@ max_depth = ${defaults.maxDepth}
|
|
|
18777
19773
|
function renderClaudeSubagentFiles(profile) {
|
|
18778
19774
|
const agents = getEnabledSubagents(profile);
|
|
18779
19775
|
const effective = deriveEffectivePermissions(profile);
|
|
18780
|
-
|
|
19776
|
+
const loggingOn = profile.workflow.loggingGuidance === true;
|
|
19777
|
+
return agents.map((agent) => createGeneratedTextFile(`.claude/agents/${agent.name}.md`, "claude-subagents", `targets/claude-subagents/${agent.name}@1`, renderClaudeSubagent(withLoggingEnforcement(agent, loggingOn), effective)));
|
|
18781
19778
|
}
|
|
18782
19779
|
function renderCodexSubagentFiles(profile) {
|
|
18783
19780
|
const agents = getEnabledSubagents(profile);
|
|
18784
19781
|
const effective = deriveEffectivePermissions(profile);
|
|
18785
|
-
|
|
19782
|
+
const loggingOn = profile.workflow.loggingGuidance === true;
|
|
19783
|
+
return agents.map((agent) => createGeneratedTextFile(`.codex/agents/${agent.name}.toml`, "codex-subagents", `targets/codex-subagents/${agent.name}@1`, renderCodexSubagent(withLoggingEnforcement(agent, loggingOn), effective)));
|
|
19784
|
+
}
|
|
19785
|
+
/**
|
|
19786
|
+
* Return `agent` with the flag-conditional logging-enforcement paragraph
|
|
19787
|
+
* appended to its prompt when applicable. The transform touches only the
|
|
19788
|
+
* emitted prompt; the canonical template prompt is left unchanged.
|
|
19789
|
+
*/
|
|
19790
|
+
function withLoggingEnforcement(agent, loggingOn) {
|
|
19791
|
+
const prompt = applyLoggingEnforcementToPrompt(agent.prompt, agent.name, loggingOn);
|
|
19792
|
+
if (prompt === agent.prompt) return agent;
|
|
19793
|
+
return {
|
|
19794
|
+
...agent,
|
|
19795
|
+
prompt
|
|
19796
|
+
};
|
|
18786
19797
|
}
|
|
18787
19798
|
function renderTabnineSubagentFiles(profile) {
|
|
18788
|
-
return
|
|
19799
|
+
return getTabnineSubagents(profile).filter((agent) => agent.toolScope === "read-only").map((agent) => createGeneratedTextFile(`.tabnine/agent/agents/${agent.name}.md`, "tabnine-subagents", `targets/tabnine-subagents/${agent.name}@1`, renderTabnineSubagent(agent)));
|
|
19800
|
+
}
|
|
19801
|
+
var REVIEWER_SUBAGENT_NAMES = new Set(REVIEWER_DEFINITIONS.map((definition) => definition.reviewerId));
|
|
19802
|
+
function getTabnineSubagents(profile) {
|
|
19803
|
+
const agents = getEnabledSubagents(profile);
|
|
19804
|
+
if (!(profile.capabilities?.delegation?.subagents?.packs?.includes("reviewer-subagents") === true)) return agents;
|
|
19805
|
+
return agents.filter((agent) => !REVIEWER_SUBAGENT_NAMES.has(agent.name));
|
|
18789
19806
|
}
|
|
18790
19807
|
function titleCaseFromKebab(name) {
|
|
18791
19808
|
return name.split("-").filter((part) => part.length > 0).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join(" ");
|
|
@@ -18913,12 +19930,28 @@ function agentsMdTopicTemplateSource(id, topic) {
|
|
|
18913
19930
|
source: renderTopicAsAgentsMdSection(topic)
|
|
18914
19931
|
};
|
|
18915
19932
|
}
|
|
19933
|
+
function advisoryHookTemplateSource(role) {
|
|
19934
|
+
return {
|
|
19935
|
+
id: getAdvisoryHookTemplateId(role),
|
|
19936
|
+
target: "claude-settings",
|
|
19937
|
+
version: "1",
|
|
19938
|
+
source: renderAdvisoryHookTemplateSource(role)
|
|
19939
|
+
};
|
|
19940
|
+
}
|
|
19941
|
+
function codexHookTemplateSource(role) {
|
|
19942
|
+
return {
|
|
19943
|
+
id: getCodexHookTemplateId(role),
|
|
19944
|
+
target: "codex-hooks",
|
|
19945
|
+
version: "1",
|
|
19946
|
+
source: renderCodexHookTemplateSource(role)
|
|
19947
|
+
};
|
|
19948
|
+
}
|
|
18916
19949
|
function workflowSkillTemplateSource(id, target, skill) {
|
|
18917
19950
|
return {
|
|
18918
19951
|
id,
|
|
18919
19952
|
target,
|
|
18920
19953
|
version: "1",
|
|
18921
|
-
source: renderWorkflowSkill(skill)
|
|
19954
|
+
source: applyModelInvocationPolicy(renderWorkflowSkill(skill), skill, target)
|
|
18922
19955
|
};
|
|
18923
19956
|
}
|
|
18924
19957
|
function hasStack(profile, field, value) {
|
|
@@ -18927,8 +19960,8 @@ function hasStack(profile, field, value) {
|
|
|
18927
19960
|
function hasAnyStack(profile, field, values) {
|
|
18928
19961
|
return values.some((value) => hasStack(profile, field, value));
|
|
18929
19962
|
}
|
|
18930
|
-
function renderClaudeSettingsJson() {
|
|
18931
|
-
|
|
19963
|
+
function renderClaudeSettingsJson(profile) {
|
|
19964
|
+
const base = `{
|
|
18932
19965
|
"permissions": {
|
|
18933
19966
|
"defaultMode": "default",
|
|
18934
19967
|
"allow": [],
|
|
@@ -18948,16 +19981,22 @@ function renderClaudeSettingsJson() {
|
|
|
18948
19981
|
"autoAllowBashIfSandboxed": false
|
|
18949
19982
|
}
|
|
18950
19983
|
}`;
|
|
19984
|
+
const roles = profile ? getSelectedAdvisoryHookRoles(profile) : [];
|
|
19985
|
+
if (roles.length === 0) return base;
|
|
19986
|
+
const hooksJson = JSON.stringify(buildClaudeAdvisoryHooksValue(roles), null, 2).split("\n").map((line, index) => index === 0 ? line : ` ${line}`).join("\n");
|
|
19987
|
+
return base.replace(/\n\}$/u, `,\n "hooks": ${hooksJson}\n}`);
|
|
18951
19988
|
}
|
|
18952
19989
|
function getEnabledTargetIds(profile) {
|
|
18953
19990
|
const targets = ["agents-md"];
|
|
18954
19991
|
const subagentsEnabled = getEnabledSubagents(profile).length > 0;
|
|
19992
|
+
const tabnineSubagentsEnabled = getTabnineSubagents(profile).length > 0;
|
|
18955
19993
|
if (profile.clients.tabnine.enabled) {
|
|
18956
19994
|
targets.push("tabnine-guidelines", "tabnine-mcp-config");
|
|
18957
|
-
if (
|
|
19995
|
+
if (tabnineSubagentsEnabled) targets.push("tabnine-subagents");
|
|
18958
19996
|
}
|
|
18959
19997
|
if (profile.clients.codex.enabled) {
|
|
18960
19998
|
targets.push("codex-config", "codex-workflow-skills");
|
|
19999
|
+
if (getSelectedAdvisoryHookRoles(profile).length > 0) targets.push("codex-hooks");
|
|
18961
20000
|
if (subagentsEnabled) targets.push("codex-subagents");
|
|
18962
20001
|
}
|
|
18963
20002
|
if (profile.clients.claude.enabled) {
|
|
@@ -18983,7 +20022,7 @@ function validateTargets(profile, targets, templates) {
|
|
|
18983
20022
|
});
|
|
18984
20023
|
}
|
|
18985
20024
|
if (targets.includes("tabnine-subagents")) {
|
|
18986
|
-
const writeAgents =
|
|
20025
|
+
const writeAgents = getTabnineSubagents(profile).filter((agent) => agent.toolScope === "workspace-write");
|
|
18987
20026
|
for (const agent of writeAgents) issues.push({
|
|
18988
20027
|
code: "unsafe_generated_content",
|
|
18989
20028
|
path: `.tabnine/agent/agents/${agent.name}.md`,
|
|
@@ -19063,16 +20102,20 @@ function getRequiredTemplateIds(target, profile) {
|
|
|
19063
20102
|
case "claude-workflow-skills": return getRequiredWorkflowSkillTemplateIds(profile, "claude-workflow-skills");
|
|
19064
20103
|
case "claude-subagents": return getEnabledSubagents(profile).map((agent) => `targets/claude-subagents/${agent.name}@1`);
|
|
19065
20104
|
case "codex-subagents": return getEnabledSubagents(profile).map((agent) => `targets/codex-subagents/${agent.name}@1`);
|
|
19066
|
-
case "tabnine-subagents": return
|
|
20105
|
+
case "tabnine-subagents": return getTabnineSubagents(profile).filter((agent) => agent.toolScope === "read-only").map((agent) => `targets/tabnine-subagents/${agent.name}@1`);
|
|
20106
|
+
case "claude-settings": return ["targets/claude-settings@1", ...getSelectedAdvisoryHookRoles(profile).map((role) => getAdvisoryHookTemplateId(role))];
|
|
20107
|
+
case "codex-hooks": return ["targets/codex-hooks@1", ...getSelectedAdvisoryHookRoles(profile).map((role) => getCodexHookTemplateId(role))];
|
|
19067
20108
|
default: return TEMPLATE_SOURCES.filter((template) => template.target === target).map((template) => template.id);
|
|
19068
20109
|
}
|
|
19069
20110
|
}
|
|
19070
20111
|
function getRequiredAgentsMdTopicTemplateIds(profile) {
|
|
19071
20112
|
const ids = [];
|
|
19072
20113
|
if (hasStack(profile, "frameworks", "react")) ids.push("targets/agents-md/30-stack-typescript-react@1");
|
|
19073
|
-
if (profile.workflow.codeReview === true) ids.push("targets/agents-md/60-code-review@1");
|
|
20114
|
+
if (profile.workflow.codeReview === true && !profile.clients.codex.enabled && !profile.clients.claude.enabled) ids.push("targets/agents-md/60-code-review@1");
|
|
19074
20115
|
if (profile.workflow.refactoring === true) ids.push("targets/agents-md/70-refactoring@1");
|
|
19075
20116
|
if (profile.workflow.documentation === true) ids.push("targets/agents-md/80-documentation@1");
|
|
20117
|
+
if (profile.workflow.memoryGuidance === true) ids.push("targets/agents-md/85-memory-guidance@1");
|
|
20118
|
+
if (profile.workflow.loggingGuidance === true) ids.push("targets/agents-md/86-logging-guidance@1");
|
|
19076
20119
|
return ids;
|
|
19077
20120
|
}
|
|
19078
20121
|
function getRequiredTabnineGuidelineTemplateIds(profile) {
|
|
@@ -19086,14 +20129,16 @@ function getRequiredTabnineGuidelineTemplateIds(profile) {
|
|
|
19086
20129
|
if (hasStack(profile, "frameworks", "react")) ids.push("targets/tabnine-guidelines/30-stack-typescript-react@1");
|
|
19087
20130
|
if (hasStack(profile, "languages", "java") && hasStack(profile, "frameworks", "spring-boot")) ids.push("targets/tabnine-guidelines/40-stack-java-spring@1");
|
|
19088
20131
|
if (hasAnyStack(profile, "testing", ["playwright", "junit"])) ids.push("targets/tabnine-guidelines/50-testing-playwright-junit@1");
|
|
19089
|
-
if (profile.
|
|
20132
|
+
if (resolveSelectedSkills(profile).includes("review-change")) ids.push("targets/tabnine-guidelines/60-code-review@1");
|
|
19090
20133
|
if (profile.workflow.refactoring === true) ids.push("targets/tabnine-guidelines/70-refactoring@1");
|
|
19091
20134
|
if (profile.workflow.documentation === true) ids.push("targets/tabnine-guidelines/80-documentation@1");
|
|
20135
|
+
if (profile.workflow.memoryGuidance === true) ids.push("targets/tabnine-guidelines/85-memory-guidance@1");
|
|
20136
|
+
if (profile.workflow.loggingGuidance === true) ids.push("targets/tabnine-guidelines/86-logging-guidance@1");
|
|
19092
20137
|
if (profile.workflow.finalReview) ids.push("targets/tabnine-guidelines/90-final-review@1");
|
|
19093
20138
|
return ids;
|
|
19094
20139
|
}
|
|
19095
20140
|
function getRequiredWorkflowSkillTemplateIds(profile, target) {
|
|
19096
|
-
return
|
|
20141
|
+
return resolveSelectedSkills(profile).map((skill) => getWorkflowSkillTemplateId(target, skill));
|
|
19097
20142
|
}
|
|
19098
20143
|
function uniqueTargets(targets) {
|
|
19099
20144
|
return Array.from(new Set(targets));
|
|
@@ -19984,5 +21029,5 @@ function truncatePreview(text, capBytes = 256 * 1024) {
|
|
|
19984
21029
|
};
|
|
19985
21030
|
}
|
|
19986
21031
|
|
|
19987
|
-
export {
|
|
19988
|
-
//# sourceMappingURL=projectContext-
|
|
21032
|
+
export { readRegionAwareFile as A, redactIfSecretLike as B, PHASE_14_SCAN_DIRS as C, loadProjectContext as D, writeProfileAtomic as E, ProfileWriteError as F, computeFileEtag as G, validateProfileValue as H, renderProfileYaml as I, truncatePreview as J, PHASE_14_SUPPORTED_PATHS as P, REGION_AWARE_ROOT_PATHS as R, VERIFIED_CLAUDE_HOOK_EVENTS as V, applyWritePlan as a, buildPhase14ImportReport as b, compileProfile as c, deriveEffectivePermissions as d, containsSecretLikeLiteral as e, hasAnyRegionMarker as f, parseMixedFile as g, hasAllRegionMarkers as h, isLoopSkillId as i, hasLegacyGeneratedMarker as j, createLockfileFile as k, sha256Hex as l, getEnabledSubagents as m, normalizeSafety as n, isSubagentBuiltinNameCollision as o, parseProfileYaml as p, getSelectedAdvisoryHookRoles as q, resolveProjectRoot as r, safeOutputPath as s, toLockfileV2View as t, getAdvisoryHookTemplate as u, validateLockfileText as v, VERIFIED_CODEX_HOOK_EVENTS as w, readLockfileForRegions as x, planRootInstructionsAdoption as y, planWrites as z };
|
|
21033
|
+
//# sourceMappingURL=projectContext-BtPm3MFR.js.map
|