Code review polish:
- Type hints: List → List[Dict[str, Any]] for cache_get return and
cache_put results parameter, since rerank produces dict-shaped entries.
- TTL=0 short-circuits to None deterministically. Previously the test
for ttl_seconds=0 passed only because clock motion between cache_put
and cache_get made `time.time() - cached_at > 0` true. Now the
semantics match the docstring intent.
8/8 tests still pass.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Cache layer for rerank results. Key is SHA256 of query + sorted
candidate IDs, so changing the candidate set automatically invalidates.
1-day TTL by default; corrupted cache files are silently dropped.
5 tests cover hit, miss, different-candidates, TTL expiry, corruption.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Code review caught that the bare alias 'claude-haiku-4-5' works in the
Claude Code CLI but may not resolve in the Anthropic SDK. Pin the
default to 'claude-haiku-4-5-20251001' (the full dated ID) via a
DEFAULT_MODEL constant so the SDK path doesn't silently break the
first time it hits the real API.
Also document the max_tokens-ignored behavior on the CLI path in the
public call_claude docstring (not just the private _call_via_cli),
and drop the unused LLMCaller type alias (dead code).
3/3 tests still pass.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
First task of Phase 3b-i (notion semantic search). Adds _search_llm.py
that dispatches to the anthropic SDK when ANTHROPIC_API_KEY is set,
falls back to `claude -p` CLI otherwise, and raises a clear setup
error if neither works. Symlinks _notion_compat.py from 32-notion-writer
so both skills share one source of truth.
3 tests cover the three dispatch paths.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds rows for callouts, toggles, columns, and page mentions in the
supported-elements and inline rich-text tables. Adds usage examples
for each. Updates version footer with changelog entry.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Code review flagged two implicit invariants worth pinning with comments:
- 'mention' must precede 'link' in INLINE_PATTERNS so the @[X](Y) prefix
takes priority over plain link parsing
- format_id_with_dashes is required because the Notion mention API expects
a dashed UUID while extract_notion_id returns dashless
32/32 tests still pass.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Inline rich-text gets a new 'mention' pattern matching @[Title](target).
Target can be a raw 32-hex page ID, a dashed UUID, or a Notion URL —
all resolved via the existing extract_notion_id helper. Invalid targets
degrade to plain text '@Title' with no warning (avoids false-positive
spam from unrelated @[x](y) patterns).
Pattern placed BEFORE 'link' in INLINE_PATTERNS so the @ prefix takes
priority over plain link parsing.
Also widens extract_notion_id's URL regex from [^-]+- to [^/]+?- so
multi-hyphen Notion URLs (e.g. notion.so/My-Cool-Page-{id}) resolve
correctly — previous regex only matched single-segment titles.
+3 tests, 32 passing total.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Pandoc-style ::: columns / ::: column / ::: blocks emit a Notion
column_list with column children. Each column's body recurses through
_parse_lines so any block type (lists, code, nested columns) works
inside. Single-column wrappers degrade to plain paragraphs because
Notion requires at least two columns.
Single-depth-counter design: depth=1 on enter, increments on `::: columns`
or `::: column`, decrements on `:::`. depth=0 closes the wrapper.
+3 tests, 29 passing total.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Code review caught a redundant `import sys as _sys` inside the unclosed-
<details> branch. The module already imports `sys` at the top, so the
inline import was dead weight. Use the module-level `sys.stderr` directly.
26/26 tests still pass.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Multi-line <details>...</details> with optional <summary> emits a Notion
toggle block. Body recurses through _parse_lines so any block type
(lists, code, nested toggles) is supported inside. Depth tracking lets
<details> nest inside <details>. Unclosed <details> at EOF degrades to
plain paragraphs with a stderr warning instead of crashing.
+4 tests, 26 passing total.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Code review caught that all 9 other create_*_block factories include
"object": "block" as the first key, but the new callout factory was
missing it. The Notion API accepts both forms, but the inconsistency
would compound; align with the existing convention.
22/22 tests still pass.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds support for > [!NOTE] / > [!TIP] / > [!IMPORTANT] / > [!WARNING] /
> [!CAUTION] callouts. Each alert type maps to a Notion callout block
with an emoji icon and matching colored background. Unknown alert types
(e.g. > [!BOGUS]) fall through to the existing quote handler with the
marker preserved.
Also restores the "must come before generic bullet match" comment on
the todo branch (load-bearing ordering note).
+6 tests, 22 passing total.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Split the entry function into a public reentrant entry that accepts
either string or List[str], and a private _parse_lines engine that
container detectors will recurse into. No behavior change for existing
callers; all 16 parser tests still pass.
Prep for Phase 3c: callout/toggle/columns/page-mention block coverage.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
New Claude Skill that wraps the `dintel-bootstrap` CLI from the
dintel-auth package to install and diagnose the three D.intelligence
custom MCP agents (DTM, D.DA, OurSEO) in ~/.claude/settings.json.
Triggers on: "set up MCP agents", "install DTM/D.DA/OurSEO", "run MCP
doctor", "bootstrap a new machine", "my MCP agents stopped working".
Scope boundaries:
- Only registers existing agent installs (does NOT clone agent repos)
- Only touches ~/.claude/settings.json (does NOT modify .mcp.json)
- Does NOT store secrets; OurSEO profile uses op run wrapper
- Does NOT trigger interactive auth; prompts user to run op signin
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Extend markdown_to_notion_blocks with GFM table support and rewrite
parse_rich_text to emit Notion annotations for bold/italic/code/link/strike
instead of dropping them as literal text. Move checkbox match ahead of the
bullet match so "- [ ]" lines become to_do blocks, not bullets.
Add test_parser.py with 13 regression tests covering rich-text spans,
block types, and table cell formatting.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The --replace flag failed with "Can't edit block that is archived" when
a page contained previously archived blocks. Now skips them during clear.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add _is_captcha_response() to detect Google sorry page, 429, and
"unusual traffic" markers in crawler responses
- Add --wayback-fallback CLI flag: auto-switches remaining URLs to
web.archive.org/web/2024/ after 3 consecutive CAPTCHA blocks
- Add --delay CLI flag for polite crawling with configurable interval
- Add retry logic with exponential backoff on 429/5xx responses
- Document GOTCHA section in crawler CLAUDE.md with detection signals,
Wayback detour solution, and prevention tips
- Add GOTCHA callout in pipeline orchestrator Stage 2 docs
- Record source: wayback in frontmatter for traceability
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add --save-raw flag: saves intact crawled markdown in raw/ subdirectory
alongside distilled content, with YAML frontmatter for traceability
- Add --no-distill flag: skip stages 4-5 (distiller + QA reviewer),
pure archival mode for raw documentation capture
- Integrate OurSEO BaseAsyncClient + PageAnalyzer as seo-aiohttp backend:
token-bucket rate limiting, semaphore concurrency, tenacity retries,
full page metadata extraction (headings, links, schema, OG)
- New seo_crawler_adapter.py: crawl URLs, sitemaps, link discovery, manifests
with progress tracking and resume support
- Update crawler selection: docs sites now default to seo-aiohttp
- Update crawl_config.yaml with seo-aiohttp routing rules
- Update pipeline orchestrator with flag resolution and skip paths
- Update README.md and USER-GUIDE.md with raw mode documentation
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
In-Action은 OurDigital 서비스 태그라인 체계의 핵심:
SEO in Action, Brand in Action, Performance in Action, Data in Action
Core Values 최종 확정: 마케팅 과학 / 실행 지향(In-Action) / 지속 성장
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Core Values 재정의: 마케팅 과학 / 실행 성과 중심 / 지속 성장
Value Prop: 마케팅 과학으로 진단하고, 실행으로 처방합니다
Brand Compliance: 5항목 → 7항목
Deprecated Terms 섹션 신설
폰트 통일: Noto Sans KR / Inter (Poppins/Lora 교체)
색상 참조 통일: #221814 / #cedc00
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Restructure 42-jamie-faq-entry into code/desktop/shared layout,
create Claude Code directive, register /jamie-faq-entry command.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Restructured from Claude Desktop extracted skills into standard dual-platform
packages (code/ + desktop/) aligned with existing skill conventions.
- 46: Journal/blog content editor for journal.jamie.clinic
- 47: Multi-channel marketing content editor with compliance checker
- Updated CLAUDE.md skill registry and directory layout
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The pattern (www|app|...|\.)?josunhotel does NOT match
www.josunhotel.com. Fix: (www|app|...)?\.?josunhotel
moves the dot outside the alternation as a separate optional match.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New section in common_issues.md covering:
- How RegEx Table content grouping works in GTM
- Common pitfall: new page paths falling to "Other"
- Gotcha: parallel Path/URL variables must stay in sync
- JHR content group category reference table
- Audit checklist for content grouping
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New section covering read_line() for text input in raw-mode TUI,
with implementation pattern and 5 gotchas from real usage.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
gtm-audit (60):
- Added Mode D rule: check elements for IDs before designing CSS triggers
gtm-editor (61):
- Added "Tagging Workflow: dataLayer First" section — always suggest
dataLayer push code for developers before creating GTM triggers
- Added multi-language snippets (JS, React, Vue, PHP)
- Added "Trigger Design: IDs First" section — prefer element IDs,
ask user to add IDs before falling back to CSS selectors
- Added ID naming convention: [section]-[element]-[action]
- Added decision tree for trigger selection
gtm-validator (62):
- Flag CSS-based triggers as fragility risk during QA
- Recommend adding IDs instead of finding alternative CSS selectors
Based on field testing with ourdigital.org GTM-N9TPJW container.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Restructured 92-mac-optimizer from a CLAUDE.md-based skill into a full
Claude Code plugin with .claude-plugin/plugin.json, 6 slash commands
(/mac-doctor, /mac-packages, /mac-environment, /mac-security,
/mac-cleanup, /mac-resources), and auto-trigger SKILL.md.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
macOS system health toolkit with 5 audit modules (packages, environment,
security, cleanup, resources) and cleanup executor. Fixed bugs from review:
- Replace GNU timeout with perl alarm (macOS compatible)
- Remove Linux-only ps --sort flag, use portable sort
- Add JSON escaping to all audit scripts
- Remove redundant classify_size branch
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
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>
((var++)) returns exit code 1 when incrementing from 0, which
triggers set -e. Added || true to all 13 arithmetic operations.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>