Add 9 agent skills (#70-#77, #88) for D.intelligence business operations: brand guardian, brand editor, doc secretary, quotation manager, service architect, marketing manager, back office manager, account manager, and skill update meta-agent. Includes shared Python package (dintel), reference docs, document/quotation templates, service module CSVs, cross-device installer, and comprehensive user guide. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
501 lines
20 KiB
Python
501 lines
20 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
D.intelligence Company Credential Generator
|
|
Brand-compliant DOCX following the D.intelligence Korean Writing Style Guide.
|
|
Tone: ~합니다 존칭 서술체 (service/company intro style)
|
|
|
|
Agent #71 (dintel-brand-editor) v1.1.0 — D.intelligence Agent Corps
|
|
Shared brand constants: dintel-shared/src/dintel/brand.py
|
|
"""
|
|
|
|
from docx import Document
|
|
from docx.shared import Inches, Pt, Cm, RGBColor
|
|
from docx.enum.text import WD_ALIGN_PARAGRAPH
|
|
from docx.enum.table import WD_TABLE_ALIGNMENT
|
|
from docx.oxml.ns import qn
|
|
import os
|
|
|
|
# ── Brand Colors ──────────────────────────────────────
|
|
# See also: dintel-shared/src/dintel/brand.py for canonical values
|
|
BRAND_DARK = RGBColor(0x1A, 0x1A, 0x2E) # Dark navy
|
|
BRAND_PRIMARY = RGBColor(0x2D, 0x2D, 0x44) # Primary text
|
|
BRAND_ACCENT = RGBColor(0xC8, 0xD6, 0x2C) # Lime/yellow accent
|
|
BRAND_GRAY = RGBColor(0x66, 0x66, 0x66) # Body text gray
|
|
BRAND_LIGHT_BG = RGBColor(0xF5, 0xF5, 0xF0) # Light background
|
|
BRAND_WHITE = RGBColor(0xFF, 0xFF, 0xFF)
|
|
|
|
OUTPUT_PATH = os.path.expanduser("~/Documents/D.intelligence_Company_Credential.docx")
|
|
|
|
|
|
def set_cell_shading(cell, color_hex):
|
|
"""Set cell background color."""
|
|
shading = cell._element.get_or_add_tcPr()
|
|
shading_elem = shading.makeelement(qn('w:shd'), {
|
|
qn('w:fill'): color_hex,
|
|
qn('w:val'): 'clear',
|
|
})
|
|
shading.append(shading_elem)
|
|
|
|
|
|
def add_section_label(doc, label_text):
|
|
"""Add ALL CAPS section label (brand rule: section labels in ALL CAPS)."""
|
|
p = doc.add_paragraph()
|
|
p.space_before = Pt(24)
|
|
p.space_after = Pt(4)
|
|
run = p.add_run(label_text.upper())
|
|
run.font.size = Pt(9)
|
|
run.font.color.rgb = BRAND_ACCENT
|
|
run.font.bold = True
|
|
run.font.name = "Arial"
|
|
|
|
|
|
def add_heading_bilingual(doc, en_title, kr_subtitle=None):
|
|
"""Add bilingual heading: English Title Case + Korean subtitle (brand rule: bilingual layering)."""
|
|
h = doc.add_heading(level=2)
|
|
h.space_before = Pt(4)
|
|
h.space_after = Pt(8)
|
|
run = h.add_run(en_title)
|
|
run.font.size = Pt(16)
|
|
run.font.color.rgb = BRAND_DARK
|
|
run.font.bold = True
|
|
run.font.name = "Arial"
|
|
|
|
if kr_subtitle:
|
|
p = doc.add_paragraph()
|
|
p.space_before = Pt(0)
|
|
p.space_after = Pt(12)
|
|
run = p.add_run(kr_subtitle)
|
|
run.font.size = Pt(10)
|
|
run.font.color.rgb = BRAND_GRAY
|
|
run.font.name = "Malgun Gothic"
|
|
|
|
|
|
def add_body(doc, text, bold_phrases=None):
|
|
"""Add body paragraph in 존칭 서술체 with brand formatting."""
|
|
p = doc.add_paragraph()
|
|
p.space_after = Pt(10)
|
|
p.paragraph_format.line_spacing = Pt(20)
|
|
|
|
if bold_phrases:
|
|
remaining = text
|
|
for phrase in bold_phrases:
|
|
if phrase in remaining:
|
|
before, _, after = remaining.partition(phrase)
|
|
if before:
|
|
run = p.add_run(before)
|
|
run.font.size = Pt(10)
|
|
run.font.color.rgb = BRAND_PRIMARY
|
|
run.font.name = "Malgun Gothic"
|
|
run = p.add_run(phrase)
|
|
run.font.size = Pt(10)
|
|
run.font.color.rgb = BRAND_PRIMARY
|
|
run.font.bold = True
|
|
run.font.name = "Malgun Gothic"
|
|
remaining = after
|
|
if remaining:
|
|
run = p.add_run(remaining)
|
|
run.font.size = Pt(10)
|
|
run.font.color.rgb = BRAND_PRIMARY
|
|
run.font.name = "Malgun Gothic"
|
|
else:
|
|
run = p.add_run(text)
|
|
run.font.size = Pt(10)
|
|
run.font.color.rgb = BRAND_PRIMARY
|
|
run.font.name = "Malgun Gothic"
|
|
|
|
|
|
def add_service_table(doc, services):
|
|
"""Add service table with brand styling."""
|
|
table = doc.add_table(rows=1, cols=2)
|
|
table.alignment = WD_TABLE_ALIGNMENT.CENTER
|
|
|
|
# Header
|
|
hdr = table.rows[0].cells
|
|
for i, text in enumerate(["Service", "Description"]):
|
|
hdr[i].text = text
|
|
for paragraph in hdr[i].paragraphs:
|
|
for run in paragraph.runs:
|
|
run.font.size = Pt(9)
|
|
run.font.bold = True
|
|
run.font.color.rgb = BRAND_WHITE
|
|
run.font.name = "Arial"
|
|
set_cell_shading(hdr[i], "1A1A2E")
|
|
|
|
# Rows
|
|
for en_name, kr_desc in services:
|
|
row = table.add_row().cells
|
|
# English service name
|
|
p0 = row[0].paragraphs[0]
|
|
run0 = p0.add_run(en_name)
|
|
run0.font.size = Pt(9)
|
|
run0.font.bold = True
|
|
run0.font.color.rgb = BRAND_DARK
|
|
run0.font.name = "Arial"
|
|
# Korean description
|
|
p1 = row[1].paragraphs[0]
|
|
run1 = p1.add_run(kr_desc)
|
|
run1.font.size = Pt(9)
|
|
run1.font.color.rgb = BRAND_GRAY
|
|
run1.font.name = "Malgun Gothic"
|
|
|
|
doc.add_paragraph() # spacer
|
|
|
|
|
|
def build_credential():
|
|
doc = Document()
|
|
|
|
# ── Page setup ──
|
|
section = doc.sections[0]
|
|
section.page_width = Cm(21)
|
|
section.page_height = Cm(29.7)
|
|
section.top_margin = Cm(2.5)
|
|
section.bottom_margin = Cm(2.5)
|
|
section.left_margin = Cm(2.5)
|
|
section.right_margin = Cm(2.5)
|
|
|
|
# ── Default font ──
|
|
style = doc.styles["Normal"]
|
|
font = style.font
|
|
font.name = "Malgun Gothic"
|
|
font.size = Pt(10)
|
|
font.color.rgb = BRAND_PRIMARY
|
|
|
|
# ════════════════════════════════════════════════════
|
|
# COVER PAGE
|
|
# ════════════════════════════════════════════════════
|
|
for _ in range(6):
|
|
doc.add_paragraph()
|
|
|
|
# Brand name
|
|
title = doc.add_paragraph()
|
|
title.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
|
run = title.add_run("D.intelligence")
|
|
run.font.size = Pt(36)
|
|
run.font.color.rgb = BRAND_DARK
|
|
run.font.bold = True
|
|
run.font.name = "Arial"
|
|
|
|
# Slogan
|
|
slogan = doc.add_paragraph()
|
|
slogan.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
|
slogan.space_before = Pt(8)
|
|
run = slogan.add_run("Think Forward")
|
|
run.font.size = Pt(14)
|
|
run.font.color.rgb = BRAND_ACCENT
|
|
run.font.italic = True
|
|
run.font.name = "Arial"
|
|
|
|
# Tagline
|
|
tagline = doc.add_paragraph()
|
|
tagline.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
|
tagline.space_before = Pt(24)
|
|
run = tagline.add_run("Analysis, Treatment & Growth")
|
|
run.font.size = Pt(11)
|
|
run.font.color.rgb = BRAND_GRAY
|
|
run.font.name = "Arial"
|
|
|
|
# Subtitle
|
|
subtitle = doc.add_paragraph()
|
|
subtitle.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
|
subtitle.space_before = Pt(8)
|
|
run = subtitle.add_run("Company Credential")
|
|
run.font.size = Pt(12)
|
|
run.font.color.rgb = BRAND_GRAY
|
|
run.font.name = "Arial"
|
|
|
|
# Date
|
|
date_p = doc.add_paragraph()
|
|
date_p.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
|
date_p.space_before = Pt(36)
|
|
run = date_p.add_run("2026")
|
|
run.font.size = Pt(10)
|
|
run.font.color.rgb = BRAND_GRAY
|
|
run.font.name = "Arial"
|
|
|
|
# ── Page break ──
|
|
doc.add_page_break()
|
|
|
|
# ════════════════════════════════════════════════════
|
|
# ABOUT D.INTELLIGENCE
|
|
# ════════════════════════════════════════════════════
|
|
add_section_label(doc, "ABOUT D.INTELLIGENCE")
|
|
add_heading_bilingual(doc, "Brand Overview", "브랜드 소개")
|
|
|
|
add_body(
|
|
doc,
|
|
"D.intelligence는 디지털 마케팅과 데이터 분석의 경계를 허물고, "
|
|
"고객의 지속가능한 성장을 이끄는 Marketing Intelligence 파트너입니다.",
|
|
bold_phrases=["Marketing Intelligence 파트너"]
|
|
)
|
|
|
|
add_body(
|
|
doc,
|
|
"데이터 인텔리전스 기반의 마케팅 전략 진단 및 컨설팅 서비스를 제공하며, "
|
|
"\"SMART Marketing Clinic\"이라는 콘셉트 아래 데이터 분석, 진단, 교육 서비스를 운영합니다. "
|
|
"이를 통해 전문성과 신뢰감을 핵심 브랜드 가치로 전달합니다.",
|
|
bold_phrases=["SMART Marketing Clinic"]
|
|
)
|
|
|
|
# Mission & Vision
|
|
add_section_label(doc, "MISSION & VISION")
|
|
add_heading_bilingual(doc, "Mission")
|
|
add_body(
|
|
doc,
|
|
"데이터 기반 의사결정으로 기업의 지속가능한 성장을 실현하는 "
|
|
"Marketing Intelligence 파트너입니다."
|
|
)
|
|
|
|
add_heading_bilingual(doc, "Vision")
|
|
add_body(
|
|
doc,
|
|
"AI 기반 마케팅 인텔리전스 서비스 플랫폼을 구축하여, "
|
|
"고객사의 데이터 활용 역량을 극대화하고, "
|
|
"마케팅 의사결정의 정확성과 속도를 혁신하는 것을 목표로 합니다."
|
|
)
|
|
|
|
# Brand Keywords
|
|
add_section_label(doc, "BRAND KEYWORDS")
|
|
|
|
kw_p = doc.add_paragraph()
|
|
kw_p.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
|
kw_p.space_before = Pt(16)
|
|
kw_p.space_after = Pt(16)
|
|
for i, kw in enumerate(["Context", "Content", "Connection"]):
|
|
run = kw_p.add_run(kw)
|
|
run.font.size = Pt(18)
|
|
run.font.color.rgb = BRAND_DARK
|
|
run.font.bold = True
|
|
run.font.name = "Arial"
|
|
if i < 2:
|
|
sep = kw_p.add_run(" | ")
|
|
sep.font.size = Pt(18)
|
|
sep.font.color.rgb = BRAND_ACCENT
|
|
sep.font.name = "Arial"
|
|
|
|
doc.add_page_break()
|
|
|
|
# ════════════════════════════════════════════════════
|
|
# WHAT WE DO — Services
|
|
# ════════════════════════════════════════════════════
|
|
add_section_label(doc, "WHAT WE DO")
|
|
add_heading_bilingual(
|
|
doc,
|
|
"SMART Marketing Clinic",
|
|
"Data Intelligence Audit, Digital Analytics Consulting & Data Storytelling"
|
|
)
|
|
|
|
add_body(
|
|
doc,
|
|
"D.intelligence는 데이터 기반의 사용자 경험 여정(User Experience Journey) 진단을 통해 "
|
|
"디지털 광고, 콘텐츠 마케팅, 검색 최적화(SEO), 웹 & 앱 최적화 서비스를 제공하며, "
|
|
"이를 통해 비즈니스 성과 중심의 마케팅 솔루션을 함께하는 성장 파트너입니다.",
|
|
bold_phrases=["사용자 경험 여정(User Experience Journey)", "성장 파트너"]
|
|
)
|
|
|
|
add_service_table(doc, [
|
|
(
|
|
"SMART Measurement & Audit",
|
|
"핵심 성과 지표(KPI) 설정, 성과 측정 계획 수립, 채널 퍼포먼스 리포팅, "
|
|
"사용자 경험 모델링, 성과 관리 체계 디자인"
|
|
),
|
|
(
|
|
"Marketing Intelligence Audit",
|
|
"디지털 마케팅 채널 성과 진단, 사용자 여정 분석을 통한 "
|
|
"마케팅 전략의 효율성 극대화 및 개선 방향 도출"
|
|
),
|
|
(
|
|
"Data Analytics Consulting",
|
|
"Google Analytics 4, Mixpanel 등 디지털 애널리틱스 도구의 진단, 설정, "
|
|
"최적화를 지원하는 전문 컨설팅 서비스"
|
|
),
|
|
(
|
|
"Performance Dashboard Design",
|
|
"퍼포먼스 대시보드 설계, 구축, 자동화를 통해 "
|
|
"데이터 기반 의사 결정을 지원하는 시각화 서비스"
|
|
),
|
|
(
|
|
"Data Storytelling Design",
|
|
"발견된 데이터 인사이트를 목표 청중에게 효과적으로 전달하여, "
|
|
"공통의 문제의식과 실천의 방향을 제시하는 데이터 시각화, 인터랙티브 프레젠테이션 디자인"
|
|
),
|
|
(
|
|
"Data Literacy Training",
|
|
"생산적인 데이터 활용을 위한 개인 역량과 조직 문화 차원의 "
|
|
"데이터 리터러시 증진을 돕는 교육, 워크숍 운영"
|
|
),
|
|
])
|
|
|
|
doc.add_page_break()
|
|
|
|
# ════════════════════════════════════════════════════
|
|
# OUR ROLE — Positioning
|
|
# ════════════════════════════════════════════════════
|
|
add_section_label(doc, "OUR ROLE")
|
|
add_heading_bilingual(doc, "Core Positioning", "핵심 역할 정의")
|
|
|
|
roles = [
|
|
("Data Intelligence Counselor", "데이터 인텔리전스 기반의 마케팅 전략 진단 파트너로서, 고객사의 디지털 마케팅 성과를 정밀하게 분석하고, 데이터에 기반한 실행 가능한 전략을 수립합니다."),
|
|
("Marketing Data Translator", "마케팅, 데이터, IT 부서 간의 언어적 장벽을 해소하는 데이터 통역사로서, 각 부서의 요구사항을 데이터의 관점에서 해석하고 연결합니다."),
|
|
("Data Literacy Enabler", "조직 내 데이터 리터러시 증진을 이끄는 엑셀러레이터로서, 구성원 개개인의 데이터 활용 역량을 강화하고, 데이터 기반 의사결정 문화를 구축합니다."),
|
|
]
|
|
|
|
for en_title, kr_desc in roles:
|
|
h = doc.add_heading(level=3)
|
|
h.space_before = Pt(16)
|
|
h.space_after = Pt(4)
|
|
run = h.add_run(en_title)
|
|
run.font.size = Pt(12)
|
|
run.font.color.rgb = BRAND_DARK
|
|
run.font.bold = True
|
|
run.font.name = "Arial"
|
|
add_body(doc, kr_desc)
|
|
|
|
doc.add_page_break()
|
|
|
|
# ════════════════════════════════════════════════════
|
|
# DATA INTELLIGENCE WORKSHOP
|
|
# ════════════════════════════════════════════════════
|
|
add_section_label(doc, "DATA INTELLIGENCE WORKSHOP")
|
|
add_heading_bilingual(doc, "Training & Education", "교육 프로그램")
|
|
|
|
add_body(
|
|
doc,
|
|
"D.intelligence는 실무 중심의 데이터 리터러시 교육 프로그램을 운영합니다. "
|
|
"Google Analytics 4 기본부터 고급 활용 테크닉까지, 마케팅 실무자의 데이터 역량 강화를 "
|
|
"체계적으로 지원합니다."
|
|
)
|
|
|
|
programs = [
|
|
("GA4 코어 트레이닝 캠프", "Google Analytics 4의 핵심 기능을 집중적으로 학습하는 실무 트레이닝 프로그램입니다."),
|
|
("마케팅 애널리틱스 1Day 챌린지", "\"1 Insight per Day\" — 마케터를 위한 애널리틱스 트리트먼트 하루에 한 가지! 한 주에 하나씩 업무에 바로 활용할 수 있는 마케팅 애널리틱스 완전정복 프로그램입니다."),
|
|
]
|
|
|
|
for name, desc in programs:
|
|
h = doc.add_heading(level=3)
|
|
h.space_before = Pt(12)
|
|
h.space_after = Pt(4)
|
|
run = h.add_run(name)
|
|
run.font.size = Pt(11)
|
|
run.font.color.rgb = BRAND_DARK
|
|
run.font.bold = True
|
|
run.font.name = "Malgun Gothic"
|
|
add_body(doc, desc)
|
|
|
|
# Approach
|
|
add_section_label(doc, "3 STEP APPROACH")
|
|
|
|
approach_p = doc.add_paragraph()
|
|
approach_p.space_before = Pt(8)
|
|
for i, (step_en, step_kr) in enumerate([
|
|
("Analysis", "현황 진단 및 데이터 분석"),
|
|
("Treatment", "맞춤형 솔루션 설계 및 적용"),
|
|
("Growth", "지속적 성과 관리 및 성장 지원"),
|
|
], 1):
|
|
run = approach_p.add_run(f" {i}. {step_en} ")
|
|
run.font.size = Pt(10)
|
|
run.font.bold = True
|
|
run.font.color.rgb = BRAND_DARK
|
|
run.font.name = "Arial"
|
|
run = approach_p.add_run(f"— {step_kr}")
|
|
run.font.size = Pt(10)
|
|
run.font.color.rgb = BRAND_GRAY
|
|
run.font.name = "Malgun Gothic"
|
|
if i < 3:
|
|
approach_p.add_run("\n")
|
|
|
|
doc.add_page_break()
|
|
|
|
# ════════════════════════════════════════════════════
|
|
# WHY D.INTELLIGENCE — Differentiators
|
|
# ════════════════════════════════════════════════════
|
|
add_section_label(doc, "WHY D.INTELLIGENCE")
|
|
add_heading_bilingual(doc, "Core Differentiators", "핵심 차별화 요소")
|
|
|
|
differentiators = [
|
|
("데이터 기반 의사 결정 체계 수립",
|
|
"단편적인 보고서 제공을 넘어, 고객사의 비즈니스 목표에 부합하는 "
|
|
"핵심 성과 지표(KPI) 설정부터 성과 관리 체계 디자인까지, "
|
|
"데이터 기반 의사 결정의 전 과정을 체계적으로 지원합니다."),
|
|
("마케팅-데이터-IT 간 통합 커뮤니케이션",
|
|
"마케팅 부서의 전략적 요구와 데이터 부서의 기술적 역량, "
|
|
"IT 부서의 인프라 환경을 유기적으로 연결함으로써, "
|
|
"조직 내 데이터 활용의 효율성을 극대화합니다."),
|
|
("실무 중심의 교육 및 역량 강화",
|
|
"이론에 그치지 않는 실무 중심의 교육 커리큘럼을 통해, "
|
|
"마케팅 실무자가 데이터를 직접 분석하고 활용할 수 있는 역량을 구축합니다."),
|
|
("엔드투엔드(End-to-End) 서비스 제공",
|
|
"진단, 컨설팅, 대시보드 구축, 데이터 스토리텔링, 교육에 이르기까지, "
|
|
"마케팅 인텔리전스의 전 영역을 아우르는 통합 서비스를 제공합니다."),
|
|
]
|
|
|
|
for title, desc in differentiators:
|
|
h = doc.add_heading(level=3)
|
|
h.space_before = Pt(12)
|
|
h.space_after = Pt(4)
|
|
run = h.add_run(title)
|
|
run.font.size = Pt(11)
|
|
run.font.color.rgb = BRAND_DARK
|
|
run.font.bold = True
|
|
run.font.name = "Malgun Gothic"
|
|
add_body(doc, desc)
|
|
|
|
doc.add_page_break()
|
|
|
|
# ════════════════════════════════════════════════════
|
|
# CONTACT — Inquiry
|
|
# ════════════════════════════════════════════════════
|
|
add_section_label(doc, "CONTACT")
|
|
add_heading_bilingual(doc, "상담문의", "Get in Touch")
|
|
|
|
add_body(
|
|
doc,
|
|
"D.intelligence의 서비스에 관심을 가져주셔서 감사합니다. "
|
|
"디지털 마케팅 성과 진단, 데이터 애널리틱스 컨설팅, 대시보드 구축, "
|
|
"데이터 리터러시 교육 등에 관한 문의 사항이나 기대 사항을 남겨주시면, "
|
|
"최선을 다해 구체적이고 명료한 검토의견을 드리도록 하겠습니다."
|
|
)
|
|
|
|
# Contact info
|
|
doc.add_paragraph()
|
|
contact_items = [
|
|
("Website", "dintelligence.co.kr"),
|
|
("Email", "contact@dintelligence.co.kr"),
|
|
]
|
|
for label, value in contact_items:
|
|
p = doc.add_paragraph()
|
|
p.space_after = Pt(4)
|
|
run = p.add_run(f"{label}: ")
|
|
run.font.size = Pt(10)
|
|
run.font.bold = True
|
|
run.font.color.rgb = BRAND_DARK
|
|
run.font.name = "Arial"
|
|
run = p.add_run(value)
|
|
run.font.size = Pt(10)
|
|
run.font.color.rgb = BRAND_GRAY
|
|
run.font.name = "Arial"
|
|
|
|
# Footer
|
|
doc.add_paragraph()
|
|
doc.add_paragraph()
|
|
footer_p = doc.add_paragraph()
|
|
footer_p.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
|
run = footer_p.add_run("D.intelligence")
|
|
run.font.size = Pt(9)
|
|
run.font.color.rgb = BRAND_GRAY
|
|
run.font.name = "Arial"
|
|
|
|
copyright_p = doc.add_paragraph()
|
|
copyright_p.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
|
run = copyright_p.add_run("Copyright 2026 D.intelligence. All rights reserved.")
|
|
run.font.size = Pt(8)
|
|
run.font.color.rgb = BRAND_GRAY
|
|
run.font.name = "Arial"
|
|
|
|
# ── Save ──
|
|
doc.save(OUTPUT_PATH)
|
|
print(f"Credential saved: {OUTPUT_PATH}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
build_credential()
|