Claude Code 대화 내용을 Slack DM으로 자동 전송하는 훅 스크립트입니다.
- Claude Code 세션의 마지막 어시스턴트 응답을 추출
- Slack API를 통해 지정된 사용자에게 DM 전송
- 이메일 주소 또는 사용자 ID를 통한 사용자 식별
- 수동 메시지 전송 기능
| { | |
| "tools": [ | |
| { | |
| "name": "browser_click", | |
| "title": "Click", | |
| "description": "Perform click on a web page", | |
| "inputSchema": { | |
| "type": "object", | |
| "properties": { | |
| "element": { |
| package com.example.coroutine | |
| import io.kotest.core.spec.style.DescribeSpec | |
| import io.kotest.matchers.shouldBe | |
| import kotlinx.coroutines.* | |
| import kotlinx.coroutines.reactive.awaitFirstOrNull | |
| import kotlinx.coroutines.reactor.mono | |
| import org.jooq.DSLContext | |
| import org.jooq.impl.DSL | |
| import kotlin.coroutines.CoroutineContext |
| <?xml version="1.0" encoding="UTF-8"?> | |
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |
| <plist version="1.0"> | |
| <dict> | |
| <key>Ansi 0 Color</key> | |
| <dict> | |
| <key>Alpha Component</key> | |
| <real>1</real> | |
| <key>Blue Component</key> | |
| <real>0.20796161890029907</real> |
| #!/bin/bash | |
| EXTERNAL_IP=$(dig +short myip.opendns.com @resolver1.opendns.com) | |
| curl -sfL https://get.k3s.io | sh -s - \ | |
| --disable=traefik \ | |
| --no-deploy=traefik \ | |
| --write-kubeconfig-mode=644 \ | |
| --tls-san=${EXTERNAL_IP} |
| import { ApolloClient, ApolloLink, HttpLink, InMemoryCache, split } from '@apollo/client' | |
| import { WebSocketLink } from '@apollo/client/link/ws' | |
| const httpLink = new HttpLink({ | |
| uri: '/graphql', | |
| }) | |
| const wsLink = new WebSocketLink({ | |
| uri: `${getWebsocketURI()}/subscriptions`, | |
| options: { |
| /// <reference types="react-scripts" /> | |
| declare module 'react-router' { | |
| import type { Location, State } from 'history' | |
| export type * from 'react-router' | |
| export declare function useLocation<S extends State = State>(): Location<S> | |
| } |
| import React from "react"; | |
| import { proxy, useSnapshot } from "valtio"; | |
| class Store { | |
| public counter = 0; | |
| public text = ""; | |
| get double() { | |
| return this.counter * 2; | |
| } |
| type Query { | |
| post(where: PostWhereUniqueInput!): Post | |
| findFirstPost( | |
| where: PostWhereInput | |
| orderBy: [PostOrderByInput!] | |
| cursor: PostWhereUniqueInput | |
| take: Int | |
| skip: Int | |
| distinct: [PostScalarFieldEnum!] | |
| ): Post |
| // Before Coroutine | |
| fun matches(exchange: ServerWebExchange): Mono<MatchResult> { | |
| return Mono.just(exchange) | |
| .map(ServerWebExchange::getRequest) | |
| .map(ServerHttpRequest::getHeaders) | |
| .filter { header -> header.containsKey(HttpHeaders.AUTHORIZATION)) } | |
| .flatMap { MatchResult.match() } | |
| .switchIfEmpty { MatchResult.notMatch() } | |
| } |