Compare MI DARES FRAMES model.in addiction management
MI DARES FRAMES model addiction management comparison motivational interviewing
https://www.ncbi.nlm.nih.gov/books/NBK571068
DARES acronym motivational interviewing substance use disorder addiction counseling
"DARES" brief intervention alcohol substance use "D-A-R-E-S" addiction
https://indianpsychiatricsociety.org/wp-content/uploads/2022…
| Skill | Description |
|---|---|
| Open questions | Invite elaboration; avoid yes/no answers |
| Affirmations | Reinforce positive statements and efforts |
| Reflections | Mirror back what the patient says, showing understanding |
| Summaries | Synthesize content to build momentum toward change |
| Letter | Element | Description |
|---|---|---|
| D | Develop discrepancy | Help the patient see the gap between current behavior and personal goals/values. The patient, not the clinician, should articulate why change matters. |
| A | Augment ambivalence | Explore and amplify the patient's mixed feelings about substance use to create motivation. Ambivalence is seen as normal, not a barrier. |
| R | Roll with resistance | Avoid arguing; don't confront head-on. Resistance is a signal to change strategy, not to push harder. Reframe or reflect back. |
| E | Express empathy | Use reflective listening to communicate understanding. A non-judgmental stance reduces defensiveness and builds the therapeutic alliance. |
| S | Support self-efficacy | Reinforce the patient's belief in their ability to change. Highlight past successes; communicate optimism about recovery. |
| Letter | Element | Description |
|---|---|---|
| F | Feedback | Provide personalized feedback about the patient's risk based on screening scores. "Your AUDIT score of 16 indicates high-risk drinking." |
| R | Responsibility | Emphasize that change is the patient's choice and responsibility alone. Autonomy is key. |
| A | Advice | Give clear, direct advice to reduce or stop substance use. Expert advice from a clinician is a potent motivator. |
| M | Menu | Offer a menu of options/strategies for change (e.g., limits, alcohol-free days, alternative activities, self-help groups). |
| E | Empathy | Use a warm, empathic, non-confrontational approach. Avoid authoritarian or coercive stances. |
| S | Self-efficacy | Support the patient's confidence that change is possible. Communicate optimism. "Many people successfully control their drinking - I'm confident you can too." |
| Feature | MI | DARES | FRAMES |
|---|---|---|---|
| Type | Full counseling approach/style | Teaching mnemonic for MI principles | Brief intervention structure |
| Duration | Multiple sessions possible (30-60 min each) | Applied within MI sessions | 5-15 minutes; 1-4 sessions |
| Setting | Specialist/generalist addiction treatment | Any MI session | Primary care, emergency dept, SBIRT |
| Target patient | Ambivalent, resistant, any SUD severity | Same as MI | At-risk use, pre-SUD or mild SUD |
| Patient stance | Actively explored and resolved | Actively worked through | Receptive to feedback and advice |
| Clinician role | Collaborative partner; evokes change talk | Facilitator using specific MI techniques | Brief advice-giver with empathy |
| Content focus | Ambivalence, change talk, sustain talk | Discrepancy, ambivalence, resistance | Risk feedback, options, self-belief |
| Evidence base | Strong - 300+ RCTs; Cochrane reviews | Subset of MI evidence | Strong for alcohol in primary care |
| Theoretical roots | Rogers' person-centered therapy + CBT | Miller & Rollnick's MI principles | Miller & Sanchez (1994); Bien et al. |
| Overlap | MI incorporates DARES principles | DARES is MI's spirit/principles | FRAMES shares Empathy + Self-efficacy with MI |
Screen (AUDIT / CAGE-AID / DAST)
|
Negative → Brief positive feedback
|
At-risk use (no SUD) → FRAMES brief intervention (5-15 min)
|
SUD / Ambivalent patient → Motivational Interviewing (DARES principles + OARS skills)
|
SUD confirmed → Referral to treatment
| FRAMES | DARES (MI) | |
|---|---|---|
| What it tells you | What to cover in a brief session | How to be as a clinician throughout |
| Directive vs. Collaborative | More directive (gives advice) | Non-directive (evokes the patient's own reasons) |
| Resistance | Not specifically addressed | Explicitly addressed ("Roll with resistance") |
| Ambivalence | Not a focus | Central focus ("Augment ambivalence") |
| Length | Very brief (5-15 min) | Can be extended across multiple encounters |
I want to practice MI with you. I want to be a patient of alcohol dependency syndrome and practice MI. Is that okay? You be a therapist and I be a client.
Yeah, I have a problem, you know, but I don't think alcohol is a problem. I drink alcohol after some time, even weekends, weekend or two times per week, but my concern is that I'm drinking once. I really don't know if it is a problem.
Yeah, I feel that my son, even my son starts telling that I should cut down. And I feel that I should reduce it. But it's only the source of enjoyment in weekend, going to parties, drinking without drink where my friends drink. It's really bad. And even if I don't go, I feel that I'm out of the group.
Yes, a few days back, I thought that I'd take it and I was thinking it with my wife. Suddenly, so I kept studying and after study time, then we talked with the advisor drink and drink. Alcoholic, it's too bad.
I feel so bad that even I know I don't drink much. I drink only um five to six units per week on the safe limit, and even that they don't like. I told my son that I'm not an alcoholic or I don't drink so hard, but I don't know what that stuff has created to relax with my friends sometimes, even go on a social gathering.
Literally, I enjoy one, two to three, you know, bottles of beer per week in the weekend, and I really enjoy it. I don't want to miss it. I like it. I like its taste. I don't think it has created some amounts of harm except noticing by my son and my wife.
Yes, you are right. I feel that relationship with my son, with my wife, and the self-esteem which, you know, as a professional they treat me, and even as an addiction psychiatrist. So I feel that I need to cut down to zero, but at the same time I enjoy it.
Pause and explain the MI technique I just used
"That took courage to say."
"You enjoy it and don't want to give it up... AND your family, your professional identity are being affected."
"On one hand... and on the other hand..."
"You're an addiction psychiatrist... and yet here you are on the other side of that chair."
"Five years from now - which version of yourself would you feel proudest of?"
| Temptation | Why I avoided it |
|---|---|
| "As an addiction psychiatrist, you of all people should know better!" | Righting reflex - would trigger defensiveness |
| "Five to six units is actually within safe limits, so..." | Giving unsolicited information - not the right moment |
| "You need to stop for your family." | Prescriptive advice - removes autonomy |
Continue the MI role-play from where we paused
This is the problem. And my wife and my son are very professional and patient. So I like very much.
Problem is, you know, I find it so difficult for tempting, you know, to continue alcohol, even I have a party tonight. And I feel that in the environment people, other people, other doctors are drinking, and I feel that it's quite normal to continue one or two pints of beer, you know. So I'm so, you know, ambivalent about it.
I would feel, you know, ashamed, sad, and, you know, I won't feel good. Actually, they feel happy when I'm not drunk, you know. But at the same time I find difficult to enjoy at the party without drink
I feel so doubtful what to do tonight. You know, I have a strong craving tonight, starting from afternoon itself, that what should I do and so ambivalent, reluctant. So, what to do actually? How to avoid it?
Generate a worksheet for tracking change talk (DARN-CAT) during sessions
ls /home/daytona/workspace/ 2>/dev/null || mkdir -p /home/daytona/workspace
mkdir -p /home/daytona/workspace/mi-worksheet && ls /home/daytona/skills/docx/scripts/office/
~/mi-worksheet/create_worksheet.js
const {
Document, Packer, Paragraph, TextRun, Table, TableRow, TableCell,
AlignmentType, HeadingLevel, BorderStyle, WidthType, ShadingType,
VerticalAlign, PageOrientation, Header, Footer, PageNumber,
NumberFormat
} = require('docx');
const fs = require('fs');
// Color palette
const COLORS = {
darkBlue: "1B3A6B",
medBlue: "2E5FAC",
lightBlue: "D6E4F7",
preparatory: "2E5FAC", // blue for DARN
mobilizing: "1B6B3A", // green for CAT
prepLight: "D6E4F7",
mobLight: "D6F7E4",
headerText: "FFFFFF",
sustain: "8B1A1A",
sustainLight: "FAE0E0",
tableHeader: "1B3A6B",
rowAlt: "F2F6FC",
white: "FFFFFF",
black: "000000",
gray: "666666",
lightGray: "F5F5F5",
borderGray: "CCCCCC"
};
function hdr(text, color = COLORS.darkBlue, size = 28, bold = true) {
return new TextRun({ text, color, size, bold, font: "Calibri" });
}
function cell(children, bgColor, width, vAlign = VerticalAlign.TOP, colSpan = 1) {
return new TableCell({
children,
shading: { type: ShadingType.CLEAR, fill: bgColor },
width: { size: width, type: WidthType.DXA },
verticalAlign: vAlign,
columnSpan: colSpan,
margins: { top: 80, bottom: 80, left: 120, right: 120 }
});
}
function para(runs, align = AlignmentType.LEFT, spacing = { before: 40, after: 40 }) {
return new Paragraph({ children: Array.isArray(runs) ? runs : [runs], alignment: align, spacing });
}
function txt(text, opts = {}) {
return new TextRun({
text,
font: "Calibri",
size: opts.size || 20,
bold: opts.bold || false,
italics: opts.italic || false,
color: opts.color || COLORS.black,
...opts
});
}
function sectionHeader(label, color) {
return para(
new TextRun({ text: label, font: "Calibri", size: 22, bold: true, color: COLORS.white }),
AlignmentType.CENTER,
{ before: 0, after: 0 }
);
}
function emptyLines(n = 3) {
return Array.from({ length: n }, () =>
new Paragraph({
children: [new TextRun({ text: " ", size: 20, font: "Calibri" })],
spacing: { before: 0, after: 60 },
border: { bottom: { style: BorderStyle.SINGLE, size: 4, color: COLORS.borderGray } }
})
);
}
// ─── TITLE SECTION ──────────────────────────────────────────────────────────
const titleSection = [
new Paragraph({
children: [new TextRun({ text: "MOTIVATIONAL INTERVIEWING", font: "Calibri", size: 40, bold: true, color: COLORS.darkBlue })],
alignment: AlignmentType.CENTER,
spacing: { before: 200, after: 60 }
}),
new Paragraph({
children: [new TextRun({ text: "Change Talk Tracker — DARN-CAT Worksheet", font: "Calibri", size: 28, bold: false, color: COLORS.medBlue })],
alignment: AlignmentType.CENTER,
spacing: { before: 0, after: 60 }
}),
new Paragraph({
children: [new TextRun({ text: "For use during MI sessions to identify, record, and reinforce change talk", font: "Calibri", size: 20, italic: true, color: COLORS.gray })],
alignment: AlignmentType.CENTER,
spacing: { before: 0, after: 240 }
}),
];
// ─── SESSION INFO TABLE ──────────────────────────────────────────────────────
const sessionInfoTable = new Table({
width: { size: 9360, type: WidthType.DXA },
borders: { top: { style: BorderStyle.SINGLE, size: 6, color: COLORS.medBlue }, bottom: { style: BorderStyle.SINGLE, size: 6, color: COLORS.medBlue }, left: { style: BorderStyle.SINGLE, size: 6, color: COLORS.medBlue }, right: { style: BorderStyle.SINGLE, size: 6, color: COLORS.medBlue }, insideH: { style: BorderStyle.SINGLE, size: 4, color: COLORS.borderGray }, insideV: { style: BorderStyle.SINGLE, size: 4, color: COLORS.borderGray } },
rows: [
new TableRow({
children: [
cell([para([txt("Client Initials / ID:", { bold: true, size: 20 }), txt(" _________________________", { size: 20 })])], COLORS.lightGray, 2200),
cell([para([txt("Session #:", { bold: true, size: 20 }), txt(" ____________", { size: 20 })])], COLORS.lightGray, 1500),
cell([para([txt("Date:", { bold: true, size: 20 }), txt(" ____________________", { size: 20 })])], COLORS.lightGray, 2000),
cell([para([txt("Clinician:", { bold: true, size: 20 }), txt(" ____________________", { size: 20 })])], COLORS.lightGray, 2160),
]
}),
new TableRow({
children: [
cell([para([txt("Primary Substance:", { bold: true, size: 20 }), txt(" _____________________________", { size: 20 })])], COLORS.white, 2800),
cell([para([txt("Stage of Change:", { bold: true, size: 20 }), txt(" ___________________________", { size: 20 })])], COLORS.white, 3000),
cell([para([txt("Session Duration:", { bold: true, size: 20 }), txt(" _______________", { size: 20 })])], COLORS.white, 2260),
]
})
]
});
// ─── DARN-CAT REFERENCE BOX ──────────────────────────────────────────────────
const refTable = new Table({
width: { size: 9360, type: WidthType.DXA },
borders: { top: { style: BorderStyle.SINGLE, size: 8, color: COLORS.darkBlue }, bottom: { style: BorderStyle.SINGLE, size: 8, color: COLORS.darkBlue }, left: { style: BorderStyle.SINGLE, size: 8, color: COLORS.darkBlue }, right: { style: BorderStyle.SINGLE, size: 8, color: COLORS.darkBlue }, insideH: { style: BorderStyle.NONE }, insideV: { style: BorderStyle.SINGLE, size: 4, color: COLORS.borderGray } },
rows: [
// Header row
new TableRow({
tableHeader: true,
children: [
cell([sectionHeader("PREPARATORY CHANGE TALK (DARN) — Building Motivation", COLORS.preparatory)], COLORS.preparatory, 4680, VerticalAlign.CENTER, 1),
cell([sectionHeader("MOBILIZING CHANGE TALK (CAT) — Commitment to Action", COLORS.mobilizing)], COLORS.mobilizing, 4680, VerticalAlign.CENTER, 1),
]
}),
// Content row
new TableRow({
children: [
cell([
para([txt("D ", { bold: true, size: 20, color: COLORS.preparatory }), txt("Desire — ", { bold: true, size: 20 }), txt('"I want / I wish / I would like to change"', { italic: true, size: 20 })]),
para([txt("A ", { bold: true, size: 20, color: COLORS.preparatory }), txt("Ability — ", { bold: true, size: 20 }), txt('"I can / I could / I am able to..."', { italic: true, size: 20 })]),
para([txt("R ", { bold: true, size: 20, color: COLORS.preparatory }), txt("Reasons — ", { bold: true, size: 20 }), txt('"It would help / The downside is..."', { italic: true, size: 20 })]),
para([txt("N ", { bold: true, size: 20, color: COLORS.preparatory }), txt("Need — ", { bold: true, size: 20 }), txt('"I have to / I need to / I must..."', { italic: true, size: 20 })]),
], COLORS.prepLight, 4680),
cell([
para([txt("C ", { bold: true, size: 20, color: COLORS.mobilizing }), txt("Commitment — ", { bold: true, size: 20 }), txt('"I will / I promise / I swear..."', { italic: true, size: 20 })]),
para([txt("A ", { bold: true, size: 20, color: COLORS.mobilizing }), txt("Activation — ", { bold: true, size: 20 }), txt('"I am ready / I am willing / I am prepared..."', { italic: true, size: 20 })]),
para([txt("T ", { bold: true, size: 20, color: COLORS.mobilizing }), txt("Taking Steps — ", { bold: true, size: 20 }), txt('"I already did / I have started / I went to..."', { italic: true, size: 20 })]),
para([txt("", { size: 20 })]),
], COLORS.mobLight, 4680),
]
})
]
});
// ─── MAIN TRACKING TABLE ─────────────────────────────────────────────────────
function trackingRowHeader() {
return new TableRow({
tableHeader: true,
children: [
cell([para([txt("#", { bold: true, size: 18, color: COLORS.white })], AlignmentType.CENTER)], COLORS.tableHeader, 400, VerticalAlign.CENTER),
cell([para([txt("Client Statement (verbatim or paraphrased)", { bold: true, size: 18, color: COLORS.white })], AlignmentType.CENTER)], COLORS.tableHeader, 3400, VerticalAlign.CENTER),
cell([para([txt("DARN-CAT\nType", { bold: true, size: 18, color: COLORS.white })], AlignmentType.CENTER)], COLORS.tableHeader, 900, VerticalAlign.CENTER),
cell([para([txt("Strength\n(1-3)", { bold: true, size: 18, color: COLORS.white })], AlignmentType.CENTER)], COLORS.tableHeader, 800, VerticalAlign.CENTER),
cell([para([txt("Clinician Response Used", { bold: true, size: 18, color: COLORS.white })], AlignmentType.CENTER)], COLORS.tableHeader, 2200, VerticalAlign.CENTER),
cell([para([txt("Notes / Follow-up", { bold: true, size: 18, color: COLORS.white })], AlignmentType.CENTER)], COLORS.tableHeader, 1660, VerticalAlign.CENTER),
]
});
}
function trackingRow(n, bg) {
return new TableRow({
children: [
cell([para([txt(String(n), { bold: true, size: 20, color: COLORS.gray })], AlignmentType.CENTER)], bg, 400, VerticalAlign.TOP),
cell([para([txt("", { size: 20 })]), para([txt("", { size: 20 })]), para([txt("", { size: 20 })])], bg, 3400, VerticalAlign.TOP),
cell([
para([txt("☐ D", { size: 18 })]),
para([txt("☐ A", { size: 18 })]),
para([txt("☐ R", { size: 18 })]),
para([txt("☐ N", { size: 18 })]),
para([txt("☐ C", { size: 18, color: COLORS.mobilizing })]),
para([txt("☐ A", { size: 18, color: COLORS.mobilizing })]),
para([txt("☐ T", { size: 18, color: COLORS.mobilizing })]),
], bg, 900, VerticalAlign.TOP),
cell([
para([txt("☐ 1", { size: 18 })]),
para([txt("☐ 2", { size: 18 })]),
para([txt("☐ 3", { size: 18 })]),
para([txt("", { size: 16, italic: true, color: COLORS.gray })]),
para([txt("1=Weak", { size: 16, italic: true, color: COLORS.gray })]),
para([txt("2=Mod", { size: 16, italic: true, color: COLORS.gray })]),
para([txt("3=Strong", { size: 16, italic: true, color: COLORS.gray })]),
], bg, 800, VerticalAlign.TOP),
cell([
para([txt("☐ Simple Reflect", { size: 18 })]),
para([txt("☐ Complex Reflect", { size: 18 })]),
para([txt("☐ Affirmation", { size: 18 })]),
para([txt("☐ Open Question", { size: 18 })]),
para([txt("☐ Summary", { size: 18 })]),
para([txt("☐ Amplify/Explore", { size: 18 })]),
], bg, 2200, VerticalAlign.TOP),
cell([para([txt("", { size: 20 })]), para([txt("", { size: 20 })]), para([txt("", { size: 20 })])], bg, 1660, VerticalAlign.TOP),
]
});
}
const trackingRows = [trackingRowHeader()];
for (let i = 1; i <= 8; i++) {
trackingRows.push(trackingRow(i, i % 2 === 0 ? COLORS.rowAlt : COLORS.white));
}
const trackingTable = new Table({
width: { size: 9360, type: WidthType.DXA },
borders: {
top: { style: BorderStyle.SINGLE, size: 6, color: COLORS.darkBlue },
bottom: { style: BorderStyle.SINGLE, size: 6, color: COLORS.darkBlue },
left: { style: BorderStyle.SINGLE, size: 6, color: COLORS.darkBlue },
right: { style: BorderStyle.SINGLE, size: 6, color: COLORS.darkBlue },
insideH: { style: BorderStyle.SINGLE, size: 4, color: COLORS.borderGray },
insideV: { style: BorderStyle.SINGLE, size: 4, color: COLORS.borderGray }
},
rows: trackingRows
});
// ─── SUSTAIN TALK SECTION ────────────────────────────────────────────────────
const sustainHeader = new Table({
width: { size: 9360, type: WidthType.DXA },
borders: { top: { style: BorderStyle.SINGLE, size: 6, color: COLORS.sustain }, bottom: { style: BorderStyle.SINGLE, size: 6, color: COLORS.sustain }, left: { style: BorderStyle.SINGLE, size: 6, color: COLORS.sustain }, right: { style: BorderStyle.SINGLE, size: 6, color: COLORS.sustain }, insideH: { style: BorderStyle.NONE }, insideV: { style: BorderStyle.NONE } },
rows: [
new TableRow({
tableHeader: true,
children: [cell([para([new TextRun({ text: "SUSTAIN TALK & RESISTANCE LOG — Record statements that argue against change", font: "Calibri", size: 22, bold: true, color: COLORS.white })], AlignmentType.CENTER)], COLORS.sustain, 9360)]
}),
new TableRow({
children: [
cell([
para([txt("Sustain Talk Types: ", { bold: true, size: 20 }), txt("Desire to continue | Ability to continue | Reasons to continue | Need to continue | Taking steps to continue", { size: 20, italic: true })]),
para([txt("MI Response: ", { bold: true, size: 20 }), txt("Roll with resistance — reflect, reframe, shift focus. Do NOT confront or argue.", { size: 20 })]),
], COLORS.sustainLight, 9360)
]
})
]
});
function sustainRow(n, bg) {
return new TableRow({
children: [
cell([para([txt(String(n), { bold: true, size: 20, color: COLORS.gray })], AlignmentType.CENTER)], bg, 400),
cell([para([txt("", { size: 20 })]), para([txt("", { size: 20 })])], bg, 3800),
cell([
para([txt("Type:", { bold: true, size: 18 })]),
para([txt("☐ Desire", { size: 18 })]),
para([txt("☐ Ability", { size: 18 })]),
para([txt("☐ Reason", { size: 18 })]),
para([txt("☐ Need", { size: 18 })]),
para([txt("☐ Steps", { size: 18 })]),
], bg, 1100),
cell([
para([txt("Response Used:", { bold: true, size: 18 })]),
para([txt("☐ Simple Reflect", { size: 18 })]),
para([txt("☐ Reframe", { size: 18 })]),
para([txt("☐ Agree + Twist", { size: 18 })]),
para([txt("☐ Shift Focus", { size: 18 })]),
para([txt("☐ Emphasize Autonomy", { size: 18 })]),
], bg, 2200),
cell([para([txt("", { size: 20 })]), para([txt("", { size: 20 })])], bg, 1860),
]
});
}
const sustainTable = new Table({
width: { size: 9360, type: WidthType.DXA },
borders: { top: { style: BorderStyle.SINGLE, size: 4, color: COLORS.sustain }, bottom: { style: BorderStyle.SINGLE, size: 4, color: COLORS.sustain }, left: { style: BorderStyle.SINGLE, size: 4, color: COLORS.sustain }, right: { style: BorderStyle.SINGLE, size: 4, color: COLORS.sustain }, insideH: { style: BorderStyle.SINGLE, size: 2, color: COLORS.borderGray }, insideV: { style: BorderStyle.SINGLE, size: 2, color: COLORS.borderGray } },
rows: [
new TableRow({
tableHeader: true,
children: [
cell([para([txt("#", { bold: true, size: 18, color: COLORS.white })], AlignmentType.CENTER)], COLORS.sustain, 400),
cell([para([txt("Sustain Talk Statement", { bold: true, size: 18, color: COLORS.white })], AlignmentType.CENTER)], COLORS.sustain, 3800),
cell([para([txt("Type", { bold: true, size: 18, color: COLORS.white })], AlignmentType.CENTER)], COLORS.sustain, 1100),
cell([para([txt("Clinician Response", { bold: true, size: 18, color: COLORS.white })], AlignmentType.CENTER)], COLORS.sustain, 2200),
cell([para([txt("Notes", { bold: true, size: 18, color: COLORS.white })], AlignmentType.CENTER)], COLORS.sustain, 1860),
]
}),
sustainRow(1, COLORS.white),
sustainRow(2, COLORS.sustainLight),
sustainRow(3, COLORS.white),
]
});
// ─── SESSION SUMMARY TABLE ───────────────────────────────────────────────────
const summaryTable = new Table({
width: { size: 9360, type: WidthType.DXA },
borders: { top: { style: BorderStyle.SINGLE, size: 6, color: COLORS.darkBlue }, bottom: { style: BorderStyle.SINGLE, size: 6, color: COLORS.darkBlue }, left: { style: BorderStyle.SINGLE, size: 6, color: COLORS.darkBlue }, right: { style: BorderStyle.SINGLE, size: 6, color: COLORS.darkBlue }, insideH: { style: BorderStyle.SINGLE, size: 4, color: COLORS.borderGray }, insideV: { style: BorderStyle.SINGLE, size: 4, color: COLORS.borderGray } },
rows: [
new TableRow({
tableHeader: true,
children: [cell([para([new TextRun({ text: "SESSION SUMMARY & SCORING", font: "Calibri", size: 22, bold: true, color: COLORS.white })], AlignmentType.CENTER)], COLORS.tableHeader, 9360)]
}),
new TableRow({
children: [
cell([
para([txt("Change Talk Count", { bold: true, size: 20 })]),
para([txt("D: ___ A: ___ R: ___ N: ___", { size: 20 })]),
para([txt("C: ___ A: ___ T: ___", { size: 20, color: COLORS.mobilizing })]),
para([txt("Total CT: _______", { bold: true, size: 20 })]),
], COLORS.prepLight, 2340),
cell([
para([txt("Sustain Talk Count: _______", { bold: true, size: 20 })]),
para([txt("CT:ST Ratio: _______", { bold: true, size: 20 })]),
para([txt("(Aim for >2:1 CT:ST)", { italic: true, size: 18, color: COLORS.gray })]),
para([txt("Strongest CT Type: _______", { size: 20 })]),
], COLORS.mobLight, 2340),
cell([
para([txt("Readiness Ruler (0-10)", { bold: true, size: 20 })]),
para([txt("Importance: ___/10", { size: 20 })]),
para([txt("Confidence: ___/10", { size: 20 })]),
para([txt("Readiness: ___/10", { size: 20 })]),
], COLORS.lightGray, 2340),
cell([
para([txt("Overall Session Phase", { bold: true, size: 20 })]),
para([txt("☐ Phase 1 — Engaging", { size: 20 })]),
para([txt("☐ Phase 1 — Focusing", { size: 20 })]),
para([txt("☐ Phase 2 — Evoking", { size: 20 })]),
para([txt("☐ Phase 2 — Planning", { size: 20 })]),
], COLORS.white, 2340),
]
}),
new TableRow({
children: [
cell([
para([txt("Key Change Talk to Reinforce Next Session:", { bold: true, size: 20 })]),
...emptyLines(2),
], COLORS.white, 4680, VerticalAlign.TOP, 2),
cell([
para([txt("Next Session Focus / Agenda:", { bold: true, size: 20 })]),
...emptyLines(2),
], COLORS.white, 4680, VerticalAlign.TOP, 2),
]
})
]
});
// ─── DARES REMINDER BOX ──────────────────────────────────────────────────────
const daresTable = new Table({
width: { size: 9360, type: WidthType.DXA },
borders: { top: { style: BorderStyle.SINGLE, size: 6, color: COLORS.medBlue }, bottom: { style: BorderStyle.SINGLE, size: 6, color: COLORS.medBlue }, left: { style: BorderStyle.SINGLE, size: 6, color: COLORS.medBlue }, right: { style: BorderStyle.SINGLE, size: 6, color: COLORS.medBlue }, insideH: { style: BorderStyle.NONE }, insideV: { style: BorderStyle.SINGLE, size: 4, color: COLORS.borderGray } },
rows: [
new TableRow({
tableHeader: true,
children: [cell([para([new TextRun({ text: "DARES PRINCIPLES CHECKLIST — MI Spirit Self-Audit (tick after each session)", font: "Calibri", size: 20, bold: true, color: COLORS.white })], AlignmentType.CENTER)], COLORS.medBlue, 9360)]
}),
new TableRow({
children: [
cell([
para([txt("☐ D — Develop Discrepancy", { bold: true, size: 20 }), txt(" Did I help the client see the gap between current behavior and their values/goals?", { size: 20 })]),
para([txt("☐ A — Augment Ambivalence", { bold: true, size: 20 }), txt(" Did I explore both sides of ambivalence without taking sides?", { size: 20 })]),
para([txt("☐ R — Roll with Resistance", { bold: true, size: 20 }), txt(" Did I avoid arguing, confronting, or pushing when the client resisted?", { size: 20 })]),
para([txt("☐ E — Express Empathy", { bold: true, size: 20 }), txt(" Did I use reflective listening and maintain a warm, non-judgmental stance?", { size: 20 })]),
para([txt("☐ S — Support Self-Efficacy", { bold: true, size: 20 }), txt(" Did I reinforce the client's belief in their ability to change?", { size: 20 })]),
], COLORS.lightBlue, 9360)
]
})
]
});
// ─── CLINICIAN REFLECTION ────────────────────────────────────────────────────
const reflectionTable = new Table({
width: { size: 9360, type: WidthType.DXA },
borders: { top: { style: BorderStyle.SINGLE, size: 4, color: COLORS.borderGray }, bottom: { style: BorderStyle.SINGLE, size: 4, color: COLORS.borderGray }, left: { style: BorderStyle.SINGLE, size: 4, color: COLORS.borderGray }, right: { style: BorderStyle.SINGLE, size: 4, color: COLORS.borderGray }, insideH: { style: BorderStyle.SINGLE, size: 2, color: COLORS.borderGray }, insideV: { style: BorderStyle.SINGLE, size: 2, color: COLORS.borderGray } },
rows: [
new TableRow({
tableHeader: true,
children: [cell([para([new TextRun({ text: "CLINICIAN SELF-REFLECTION", font: "Calibri", size: 20, bold: true, color: COLORS.white })], AlignmentType.CENTER)], COLORS.darkBlue, 9360)]
}),
new TableRow({
children: [
cell([
para([txt("What went well in this session?", { bold: true, size: 20 })]),
...emptyLines(3),
], COLORS.white, 3120),
cell([
para([txt("Where did I feel the righting reflex? How did I manage it?", { bold: true, size: 20 })]),
...emptyLines(3),
], COLORS.lightGray, 3120),
cell([
para([txt("One thing to practice / improve next session:", { bold: true, size: 20 })]),
...emptyLines(3),
], COLORS.white, 3120),
]
})
]
});
// ─── FOOTER NOTE ─────────────────────────────────────────────────────────────
const footerNote = [
new Paragraph({
children: [new TextRun({ text: "Based on Miller & Rollnick (2013) Motivational Interviewing: Helping People Change, 3rd ed. | SAMHSA TIP 35 (2019) | Sarkar et al., Indian Journal of Psychiatry (2020)", font: "Calibri", size: 16, italic: true, color: COLORS.gray })],
alignment: AlignmentType.CENTER,
spacing: { before: 160, after: 80 }
}),
new Paragraph({
children: [new TextRun({ text: "DARN-CAT = Desire, Ability, Reasons, Need | Commitment, Activation, Taking Steps DARES = Develop discrepancy, Augment ambivalence, Roll with resistance, Express empathy, Support self-efficacy", font: "Calibri", size: 16, italic: true, color: COLORS.gray })],
alignment: AlignmentType.CENTER,
spacing: { before: 0, after: 80 }
}),
];
// ─── BUILD DOCUMENT ───────────────────────────────────────────────────────────
const doc = new Document({
sections: [{
properties: {
page: {
margin: { top: 720, bottom: 720, left: 900, right: 900 },
}
},
children: [
...titleSection,
sessionInfoTable,
new Paragraph({ children: [], spacing: { before: 200, after: 0 } }),
new Paragraph({ children: [new TextRun({ text: "QUICK REFERENCE — Change Talk Types", font: "Calibri", size: 22, bold: true, color: COLORS.darkBlue })], spacing: { before: 0, after: 100 } }),
refTable,
new Paragraph({ children: [], spacing: { before: 200, after: 0 } }),
new Paragraph({ children: [new TextRun({ text: "CHANGE TALK TRACKER", font: "Calibri", size: 22, bold: true, color: COLORS.darkBlue })], spacing: { before: 0, after: 100 } }),
trackingTable,
new Paragraph({ children: [], spacing: { before: 200, after: 0 } }),
sustainHeader,
sustainTable,
new Paragraph({ children: [], spacing: { before: 200, after: 0 } }),
summaryTable,
new Paragraph({ children: [], spacing: { before: 200, after: 0 } }),
daresTable,
new Paragraph({ children: [], spacing: { before: 200, after: 0 } }),
reflectionTable,
new Paragraph({ children: [], spacing: { before: 200, after: 0 } }),
...footerNote,
]
}]
});
Packer.toBuffer(doc).then(buffer => {
fs.writeFileSync("/home/daytona/workspace/mi-worksheet/DARN_CAT_Change_Talk_Tracker.docx", buffer);
console.log("Done: DARN_CAT_Change_Talk_Tracker.docx");
}).catch(err => {
console.error("Error:", err);
process.exit(1);
});
cd /home/daytona/workspace/mi-worksheet && node create_worksheet.js
python /home/daytona/skills/docx/scripts/office/validate.py /home/daytona/workspace/mi-worksheet/DARN_CAT_Change_Talk_Tracker.docx
cd /home/daytona/workspace/mi-worksheet && python3 -c " import zipfile, os path = 'DARN_CAT_Change_Talk_Tracker.docx' size = os.path.getsize(path) print(f'File size: {size} bytes') with zipfile.ZipFile(path) as z: names = z.namelist() print('Contents:', names[:10]) # Check word/document.xml exists if 'word/document.xml' in names: print('document.xml: OK') content = z.read('word/document.xml') print(f'document.xml size: {len(content)} bytes') "
DARN CAT Change Talk Tracker
Word Document · DOCX